工作一年了,在外包公司里面,浑浑噩噩的,一年时间也没有学到什么东西,原本会的也忘记了。这几天投简历面试,也没有看面试题,就急匆匆的上了战场,所以死的很惨。
昨天面试的时候,问了一个比较常见的问题,就是hibernate怎么样实现延迟加载的问题,因为这个问题以前刚工作的时候面试过,所以还是记得很清楚,回答了一下hibernate2和hibernate3分别是如何实现的之后,面试官又问了一句:hibernate2通过实体对象和集合实现延迟加载的原理是什么?
当时听到这句话的时候,我就是感觉有点儿蒙了,因为这个问题我并没有关注过,也从来没有想过,当初是因为背面试题知道的,这么久也没有看,所以这个问题便是没有回答出来。
回来之后,仔细的查找了一下资料,并没有看源码,发现hibernate2实现延迟加载主要是以下三种:
(1)当调用Session上的load()方法加载一个实体时,会采用延迟加载。
(2)当Session加载某个实体时,会对这个实体中的集合属性值采用延迟加载。
(3)当Session加载某个实体时,会对这个实体所单端关联的另一个实体对象采用延迟加载。
Session的load()方法对实体的加载默认采用延迟加载,而get()方法默认采用立即加载。如果只访问对象标识符属性,它就没有必要初始化代理。
延迟加载确实会给程序的查询效率带来好处,但有时明确知道数据需要立即加载的,如果Hibernate先默认使用延迟加载,而后又必须去数据库加载,反而会降低效率。所以,需要根据应用程序的实际情况来灵活控制是否使用延迟加载。在Hibernate中只需要修改响应的配置来启用或关闭延迟加载功能:
(1)在加载单个实体,如果不需要延迟加载,就可以使用Session的get()方法。
(2)当Session加载某个实体时,不需要对这个实体中的集合属性值延迟加载,而是要立即加载。这时可以再映射文件中针对这个集合的配置元素(<set>、<bag>、<list>......)添加属性lazy=false。
(3)当Session家在某个实体时,不需要对这个实体所单端关联的另一个实体对象延迟加载,就可以在映射文件中针对这个单端关联的配置元素(<one-to-ong>、<many-to-one>)添加属性lazy=false。
以上就是我所知道的了,写出来,记下来,算是为之后的学习打个基础吧。