liuzhihu的gravatar头像
liuzhihu 2016-08-16 08:10:10
hibernate延迟加载的实现

工作一年了,在外包公司里面,浑浑噩噩的,一年时间也没有学到什么东西,原本会的也忘记了。这几天投简历面试,也没有看面试题,就急匆匆的上了战场,所以死的很惨。

昨天面试的时候,问了一个比较常见的问题,就是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。

以上就是我所知道的了,写出来,记下来,算是为之后的学习打个基础吧。


打赏
最近浏览
淡如清水 2021年5月25日
暂无贡献等级
小河码  LV1 2019年8月30日
m15030236050 2018年4月10日
暂无贡献等级
q468468  LV6 2018年3月23日
Luis虎子  LV16 2017年8月8日
04300115116 2017年6月1日
暂无贡献等级
tonyboom 2017年5月24日
暂无贡献等级
ch292297  LV1 2017年4月28日
gd19930626  LV4 2017年3月1日
15887888408  LV3 2017年2月5日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友