张国良编辑
SSH面试题
版本1.0
1.struts1与struts2的区别 :
1、两者之间目前只有名字是一样的。
2、struts1是通过继承来实现相关机制的。而struts2是通过接口方式来实现的。
3、在struts2中没有了ActionForm使用Action来代替原来struts1中的ActionForm和Action两者的功能。
4、Struts2比Struts1更加容易进行单元测试
5、线程安全
2.hibernate与iBATIS的区别
hibernate和ibatis都是持久层的ORM框架,hibernate是全自动化的,而ibatis是半自动化的。
为什么这样说呢?因为hibernate把我们要用到的增、删、改的SQL语句都封装了,我们不需要再自己手动写,直接调用即可, 所以称它全自动。而对于ibatis,所有的SQL语句都要我们自己来手写,所以称它为半自动化的框架,就等于是一个O/R Mapping 解决方案.有了这框架,只要配置下映射文件,就不需要手写sql语句了.Hibernate是全自动化的,可以说O/R做的相当全面了.
iBateis和Hibernate相比,iBatis最大的特点就是小巧,上手很快。如果你不需要太多复杂的功能,iBatis是能满足你的要求又足 够灵活的最简单的解决方案
3、hibernate的优化(项目)
1.使用双向一对多关联,不使用单向一对多
2.灵活使用单向一对多关联
3.不用一对一,用多对一取代
4.配置对象缓存,不使用集合缓存
5.一对多集合使用Bag,多对多集合使用Set
6.继承类使用显式多态
7.表字段要少,表关联不要怕多,有二级缓存撑腰
4、hibernate中seion与seionfactory的联系,分别什么时候用
seionFactory、seion都是由hibernate框架生成的,其中seionFactory包括了数据库配置和映射关系等资源,一个项目中只能生成一个seionFactory实例。因此seionFactory被设计成线程安全的。seion是对对象进行操作并映射至对应的数据库表中的,它由seionFactory生成,不支持多线程并发,因此它是非线程安全的。
5、hibernate中get和load的区别
1、它们都用来根据主键,查找相应的记录
2、load和get方法对缓存的应用不同,其中load和get都可以使用seion层的缓存,但是对于load可以应用二级缓存,而get无法使用
抛异常Null
张国良编辑
注意:criteria也是绑定seion的,即随着seion的产生而产生,随着seion的消亡而消亡。如果想重用criteria对象,必须使用DetechedCriteria对象,实现criteria和seion进行分离。
7、在项目中用hibernateORM框架与传统jdbc比较有什么优点
延迟加载:
延迟加载机制是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作。在Hibernate中提供了对实体对象的延迟加载以及对集合的延迟加载,另外在Hibernate3中还提供了对属性的延迟加载。
hibernate中lazy的使用
hibernate中lazy的使用 (2008-09-12 13:57:47)
标签:杂谈分类:hibernate
hibernate中lazy的使用
lazy,延迟加载
Lazy的有效期:只有在seion打开的时候才有效;seion关闭后lazy就没效了。
lazy策略可以用在:
* 标签上:可以取值true/false
*
* /等集合上,可以取值为true/false/extra
* /等标签上,可以取值false/proxy/no-proxy
一、概念:即两者之间存在关联关系,那么在加载主对象的时候,对副对象的加载处理,是延迟或立即,比如说公司(主)-》部门(副).二、分析
1.立即检索
实现方法:将属性的lazy设为false,即不延迟加载.注解是@fetch = FetchType.EAGER.
检索方式:加载主对象的同时加载副对象信息,反之亦然.
优点:即使当前seion关闭,处于游离状态,也能获取到关联对象.
缺点:执行的SQL太多,增加数据库压力,还可能加载一些不需要的对象,即浪费时间,又浪费缓存控件.
优先使用场合:
a.在业务或程序中,需要立即访问关联对象时可以使用.
b.使用二级缓存.
2.延迟检索
实现方法:将属性的lazy设为true,即延迟加载.注解是@fetch = FetchType.LAZY.
检索方式:不立即检索与之关联的对象,但是会为关联对象创建一个代理对象,这个代理对象只初始化一个OID,只有这个代理对象的属性被访问时,才初始化该代理对象.
优点,缺点:与立即检索相反.
优先使用场合:
a.一对多或多对多的关联使用.
b.在程序中不需要立即访问或者该关联的对象不需要访问的时候.
什么时候用延迟加载
例如:银行开户,一个人可以开多个帐户,一个帐户只能属于一个人,所以在用户类里包含一个帐户的集合,帐户类里包含一个用户类型,他们之间是一对多的关系.
如过你在查询的时候,通过用户查询是,如果只想查到用户就用(hibernate)默认的延迟加载,这样效率也高,如果你想把该用户的的所有帐户都一同查出来,那就需要立即加载了,这样一来如果一个用户对应的帐户比较多的话,他的效率是很低的.
设置加载方式一般有两种,一种是通过映射文件(lazy=false),另一种是通过程序的方式来实现的也很简单.
Struts2工作流程:
Struts2:
(1)客户端提交一个HttpServletRequest请求(.action或JSP页面)。
(2)请求被提交到一系列Filter过滤器,如ActionCleanUp和FilterDispatcher等。
(3)FilterDispatcher是Struts2控制器的核心,它通常是过滤器链中的最后一个过滤器。
(4)请求发到FilterDispatcher后,FilterDispatcher询问ActionMapper是否需要调用某个Action来处理这个Request(一般根据URL后缀是否为.action来判断)。
(5)如果ActionMapper决定需要调用某个Action,FilterDispatcher则把请求交到ActioProxy,由其进行处理。
(6)ActionProxy通过Configuration Manager(它会访问struts.xml)询问框架的配置文件,找到需要调用的Action类。
(7)ActionProxy创建一个ActionInvocation实例,而ActionInvocation通过代理模式调用Action,(在调用之前会根据配置文