`
as11051105
  • 浏览: 59336 次
  • 性别: Icon_minigender_1
  • 来自: 贵阳
社区版块
存档分类
最新评论

Hibernate懒加载解析(转)

阅读更多
    在Hibernate框架中,当我们要访问的数据量过大时,明显用缓存不太合适, 因为内存容量有限 ,为了减少并发量,减少系统资源的消耗,这时Hibernate用懒加载机制来弥补这种缺陷,但是这只是弥补而不是用了懒加载总体性能就提高了。
    我们所说的懒加载也被称为延迟加载,它在查询的时候不会立刻访问数据库,而是返回代理对象,当真正去使用对象的时候才会访问数据库。
    实现懒加载的前提:
1 实体类不能是final的
2 能实现懒加载的对象都是被CGLIB(反射调用)改写的代理对象,所以不能是final修饰的
3 须要asm,cglib两个jar包
4 相应的lazy属性为true
5 相应的fetch属性为select
    下面几种可以实现懒加载功能:
1、   通过Session.load()实现懒加载
load(Object, Serializable):根据id查询 。查询返回的是代理对象,不会立刻访问数据库,是懒加载的。当真正去使用对象的时候才会访问数据库。
用load()的时候会发现不会打印出查询语句,而使用get()的时候会打印出查询语句。
使用load()时如果在session关闭之后再查询此对象,会报异常:could not initialize proxy - no Session。处理办法:在session关闭之前初始化一下查询出来的对象:Hibernate.initialize(user);
使用load()可以提高效率,因为刚开始的时候并没有查询数据库。但很少使用。
2、   one-to-one(元素)实现了懒加载。
在一对一的时候,查询主对象时默认不是懒加载。即:查询主对象的时候也会把从对象查询出来。
需要把主对象配制成lazy="true" constrained="true"  fetch="select"。此时查询主对象的时候就不会查询从对象,从而实现了懒加载。
一对一的时候,查询从对象的是默认是懒加载。即:查询从对象的时候不会把主对象查询出来。而是查询出来的是主对象的代理对象。
3、   many-to-one(元素)实现了懒加载。
多对一的时候,查询主对象时默认是懒加载。即:查询主对象的时候不会把从对象查询出来。
多对一的时候,查询从对象时默认是懒加载。即:查询从对象的时候不会把主对象查询出来。
hibernate3.0中lazy有三个值,true,false,proxy,默认的是lazy="proxy".具体设置成什么要看你的需求,并不是说哪个设置就是最好的。在<many-to-one>与<one-to-one>标签上:当为true时,会有懒加载特性,当为false时会产生N+1问题,比如一个学生对应一个班级,用一条SQL查出10个学生,当访问学生的班级属性时Hibernate会再产生10条SQL分别查出每个学生对应的班级.
lazy= 什么时候捉取
fetch= 捉取方式:select=关联查询;join=连接表的方式查询(效率高)
fetch=join时,lazy的设置将没有意义.
4、   one-to-many(元素)懒加载:默认会懒加载,这是必须的,是重常用的。
一对多的时候,查询主对象时默认是懒加载。即:查询主对象的时候不会把从对象查询出来。
一对多的时候,查询从对象时默认是懒加载。即:查询从对象的时候不会把主对象查询出来。
需要配置主对象中的set集合lazy="false" 这样就配置成是不懒加载了。或者配置抓取方式fetch="join"也可以变成不懒加载。
实现懒加载的方案:
方法一:(没有使用懒加载) 
用 Hibernate.initialize(de.getEmps()) 提前加载一下.
方法二:
把与Session脱离的对象重新绑定
lock()方法是用来让应用程序把一个未修改的对象重新关联到新session的方法。
//直接重新关联
session.lock(fritz,LockMode.NONE);
//进行版本检查后关联
session.lock(izi,LockMode.READ);
//使用SELECT... FOR UPDATE进行版本检查后关联
session.lock(pk,LockMode.UPGRADE);
方法三:
OpenSessionInView
参见 http://www.javaeye.com/topic/32001         
fetch 和 lazy 配置用于数据的查询
lazy 参数值常见有 false 和 true,Hibernate3映射文件中默认lazy = true ;
fetch 指定了关联对象抓取的方式,参数值常见是select和join,默认是select,select方式先查询主对象,再根据关联外键,每一个对象发一个select查询,获取关联的对象,形成了n+1次查询;而join方式,是leftouter join查询,主对象和关联对象用一句外键关联的sql同时查询出来,不会形成多次查询。
在映射文件中,不同的组合会使用不同的查询:
1、lazy="true" fetch = "select" ,使用延迟策略,开始只查询出主对象,关联对象不会查询,只有当用到的时候才会发出sql语句去查询 ;
2、lazy="false" fetch = "select" ,没有用延迟策略,同时查询出主对象和关联对象,产生1+n条sql.
3、lazy="true"或lazy="false"fetch = "join",延迟都不会作用,因为采用的是外连接查询,同时把主对象和关联对象都查询出来了.
另 外,在hql查询中,配置文件中设置的join方式是不起作用的,而在其他查询方式如get、criteria等是有效的,使用 select方式;除非在hql中指定join fetch某个关联对象。fetch策略用于get/load一个对象时,如何获取非lazy的对象/集合。 这些参数在Query中无效。
分享到:
评论

相关推荐

    集成spring的hibernate懒加载

    在Java的Web开发中,Spring框架与Hibernate的整合是常见的数据访问层实现方式。Spring提供了强大的依赖注入(DI)和AOP(面向切面编程...以上就是关于"集成spring的hibernate懒加载"问题的详细解析,希望对你有所帮助。

    Hibernate 延迟加载剖析与代理模式应用

    《Hibernate延迟加载与代理模式解析》 在Java的持久化框架Hibernate中,延迟加载(Lazy Load)是一项重要的优化策略,其核心目标是提高系统性能,减少内存占用,避免不必要的数据库交互。延迟加载允许我们在需要...

    Hibernate注释深入解析

    【Hibernate注释深入解析】 在Java开发中,Hibernate是一个广泛使用的对象关系映射(ORM)框架,它允许开发者使用面向对象的方式操作数据库。在Hibernate中,注释是一种强大的工具,可以简化配置,使得代码更加简洁...

    Hibernate源码解析(二)

    Hibernate的Enhancer类可以动态增强实体类,使其具备懒加载、代理等功能。在源码中,我们可以看到这些注解是如何被解析和应用到实际操作中的。 四、Session与Transaction管理 Session是Hibernate的工作单元,它...

    Hibernate源码解析(一)

    《Hibernate源码解析(一)》 在Java开发领域,Hibernate作为一款强大的对象关系映射(ORM)框架,极大地简化了...在后续的篇章中,我们将继续深入探讨Hibernate的其他重要概念和组件,如第二级缓存、懒加载机制等。

    Hibernate原理解析

    **Hibernate原理解析** Hibernate是一个开源的Java语言下的对象关系映射(ORM)框架,它为开发者提供了在Java应用程序中操作数据库的强大工具。通过Hibernate,开发者可以将数据库操作与业务逻辑解耦,使得代码更加...

    Hibernate的延迟加载

    通过上述解析,可以看出Hibernate的延迟加载机制在多个层面提供了一种智能的性能优化策略。无论是对于单个实体还是集合,延迟加载都能确保只有在真正需要时才执行昂贵的数据库操作,极大地提升了数据加载效率和应用...

    Hibernate源码解析(三)

    《Hibernate源码解析(三)》这篇文章主要探讨了Hibernate框架的深入源码解析,这是对 Hibernate 框架理解的进一步深化。在本篇中,作者聚焦于几个关键的组件和机制,帮助读者理解 Hibernate 如何高效地管理和操作...

    hibernate源码分析

    Hibernate包含许多高级特性,如懒加载(Lazy Loading)、级联操作(Cascading)、HQL(Hibernate Query Language)、Criteria API等。懒加载通过延迟加载策略减少内存占用,级联操作可以将操作自动应用到关联的对象...

    Hibernate延迟加载

    ### Hibernate延迟加载深入解析 #### 一、概念与原理 **延迟加载**(Lazy Loading)是Hibernate框架中的一个重要特性,主要用于优化数据库操作,减少不必要的数据加载,从而提升应用程序的性能。在传统的Eager ...

    Hibernate数据持久层jar包源码解析

    《Hibernate数据持久层jar包源码解析》 在软件开发中,数据持久层是系统架构中的关键部分,它负责将应用程序的数据与数据库进行交互。Hibernate作为一款强大的Java对象关系映射(ORM)框架,极大地简化了这个过程。...

    hibernate一键休眠,SDK程式源码

    1. 原理:当实体类的一个属性被声明为懒加载时,Hibernate不会在查询主对象时立即加载该属性,而是在需要时才通过单独的SQL查询获取。这样可以避免一次性加载大量数据,降低内存压力。 2. 实现:Hibernate使用代理...

    Hibernate映射解析 七种映射关系 后端 - Java.zip

    7. **懒加载(Lazy Loading)**:Hibernate支持延迟加载(Lazy Loading),这意味着关联的对象不会在实体加载时立即加载,而是在第一次访问时才加载。通过在关联注解上设置`fetch=FetchType.LAZY`可以实现懒加载。 ...

    精通hibernate源码ch5

    Hibernate的Session接口是操作实体的主要入口,它负责管理实体的生命周期,包括加载、保存、更新和删除等操作。在Chapter5中,我们将深入探讨Session的实现原理,理解其如何管理和协调对象和数据库之间的交互。 三...

    hibernate在集合上的lazy策略

    8. **源码分析**:深入到Hibernate的源码层面,解析懒加载的实现细节,帮助读者理解其工作原理。 综上所述,"hibernate在集合上的lazy策略"这一主题涵盖了Hibernate持久化框架中的一个重要特性,它涉及到数据访问...

    hibernate的jar包

    8. **延迟加载(Lazy Loading)**:Hibernate支持懒加载机制,只有当真正需要访问关联对象时,才会发起数据库查询。 9. **集合映射**:Hibernate支持多种集合类型的映射,如List、Set、Map等,以及一对一、一对多、多...

    hibernate5.2.9

    9. **懒加载(Lazy Loading)**:Hibernate支持延迟加载,即关联的对象在需要时才从数据库加载,有效提高了程序性能。 10. **缓存机制**:Hibernate提供了第一级缓存(Session级别的)和第二级缓存(SessionFactory...

    Hibernate事件框架之拦截器使用源代码

    3. **`onLoad`**:当实体从数据库加载时调用。 ```java public boolean onLoad(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) { System.out.println("===============...

    hibernate对应的jar包

    同时,Hibernate还支持级联操作、懒加载、缓存机制等高级特性,能够优化性能并简化数据持久化过程。 总的来说,"hibernate对应的jar包"是构建基于Hibernate的Java应用程序的基础,包含了执行ORM操作所需的所有核心...

Global site tag (gtag.js) - Google Analytics