SSH框架面试题集锦
Hibernate的工作原理及为什么要使用Hibernate?
Hibernate是一个开放源代码的O/R Mapping 持久化框架,一个用于和数据库进行交互的中间件.
工作原理:
1.读取并解析配置文件
2.读取并解析映射文件,创建SessionFactory
3.打开Session
4.创建事务Transation
5.持久化操作
6,提交事务
7.关闭Session
8.关闭SessionFactory
为什么要使用Hibernate(即它的优点)?
1.对JDBC访问数据库的代码作了封装,大大简化了数据访问层繁琐的重复性代码
2.Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现,它很大程度上简化了DAO层的编码工作
3.Hibernate使用Java反射机制,而不是字节码增强程序来实现透明性
4.Hibernate映射的灵活性很出色,它支持各种关系型数据库,从一对一到多对多的各种复杂的关系
Hibernate中get和load方法的区别?
具体介绍:
1.对于get方法,hibernate会确认一下该id对应的数据是否存在,首先在session缓存中查找,然后在二级缓存中,还没有查到就查询数据库,数据库没有就返回null.
2.load方法加载实体对象的时候,根据映射文件上类级别的lazy属性的配置(默认为true)
分情况讨论:
若为true,则首先在Session的缓存中查找,看看该对应的id对象是否存在,不存在则使用延迟加载,返回实体的代理类对象(该代理类为实体类的子类,由CGLIB生成)等到具体使用该对象(除获取OID )的时候,在查询二级缓存和数据库,若仍没发现符合条件的记录,则会抛出一个ObjectNotFoundException.
若为false就跟get方法查找的顺序一样,只是最终若没有发现符合条件的记录,则会抛出一个ObjectNotFoundException.
Hibernate是如何延迟加载?
Hibernate3提供了属性的延迟加载功能,当Hibernate在查询数据的时候,数据并没有存在内存之中,而是当程序真正对对象进行操作时,对象才存在于内存中,就实现了延迟加载,它节省了内存开销,从而提高了服务器的性能.
Hibernate怎样实现类之间的关系?
类与类之间的关系主要体现在表与表之间的关系进行操作,他们都是对对象进行操作,我们在所有的表与表都映射在一起,它们通过配置文件中的many-to-one many-to many one-to-many 进行操作.
说说Hibernate中的缓存机制?
1.一级缓存:内部缓存存在Hibernate中,属于应用事务级缓存
2.二级缓存: 应用级缓存,分布式缓存.使用场景:数据不会被第三方修改,数据大小在可接受的范围,数据更新频率低,同一数据被系统频繁使用,非关键数据
如何优化Hibernate?
1.使用双向一对多关联,不使用单向一对多
2.灵活使用单向一对多关联
3.不用一对一,使用多对一取代
4.配置对象缓存,不使用集合缓存
5.一对多集合使用Bag,多对多集合使用Set
6.继承类使用显示多态
7.表字段要少,表关联不要怕多,有二级缓存撑腰
谈谈hibernate 的延迟加载和openSessionInView
延迟加载要在session范围内,用到的时候在加载;
opensessioninview是在web层写了一个filter来打开和关闭session,这样就表示在一次request过程中session一直开着,保证了延迟加载在session中的这个前提
简要阐述struts2的工作流程
struts2是一个按照MVC设计模式,开发的一个开源的web应用框架由一组相互协作的类或组件,Servlet以及JSP标签库组成.
1.客户端浏览器发出HTTP请求
2.根据web,xml配置,该请求被FilterDispatcher接受,
3.根据struts.xml配置,找到需要调用的Action类,和方法,并通过Ioc方式,将值注入给Action
4,Action调用业务逻辑组件处理业务逻辑,这一步包含表单验证
5.Action执行完毕,根据struts,xml中的配置找到对应的返回结果result,并跳转到响应的页面
6.返回HTTP响应到客户端浏览器
什么是AOP?
面向切面编程(AOP)完善spring的依赖注入(DI)面向切面编程在spring中主要表现在两个方面:
1.面向切面编程提供声明式事务管理
2.spring支持用户自定义的切面
什么是DI机制?
依赖注入(Dependency Injection) 和控制反转(Inversion of Control) 是同一个概念,具体的讲:当某个角色需要另外一个角色的协助的时候,在传统的设计过程中,通常油调用者,来创建被调用者的实例.
在spring中,创建被调用者的工作不再由调用者来完成,因此成为控制反转创建被调用者的工作由spring来完成,然后注入调用者,因此也成为依赖注入.
spring以动态灵活的方式来管理对象,注入的两种方式,设置注入和构造注入
设置注入的优点:直观.自然
构造注入的优点:可以在构造器中决定依赖关系的顺序.