`

Hibernate懒加载深入分析

 
阅读更多

懒加载可以提高性能吗?
不可以简单的说"能",因为Hibernate的关系映射拖累了SQL的性能,所以想出懒加载来弥补.只是弥补而以,不会超越.所以大家不要想着使用了懒加载总体性能就提高了,其实总体性能不下降就万幸了.
----------------------------------------------------------
Hibernate的lazy属性可以配置在:

(常用)<set><list>标签上,可以取值true,false,extra
            默认为true,当为true时,会懒加载,访问集合属性时再发出SQL语句.但set.size()时,很不智能,不会生成count()语句,而是查出所有记录赋值给set.
            extra说明:调用集合的set.size()时,会生成select count(*)from tableName,比较智能.建议使用
(少用)<many-to-one><one-to-one>标签上,可以取值false,proxy,noproxy
            当为true时,会有懒加载特性,当为false时会产生N+1问题,比如一个学生对应一个班级,用一条SQL查出10个学生,当访问学生的班级属性时Hibernate会再产生10条SQL分别查出每个学生对应的班级.
(不用)<class>标签上,可以取值true,false
            默认为true,当为false时,load()方法将失去懒加载的特性与get()一样,不影响集合(<set><list>)标签上的lazy特性
(不用)<property>标签上,可以取值true,false
            默认值为false,懒加载某个字段,无意义,不要使用

----------------------------------------------------------
get()与load()的区别
get()无懒加载特性,马上执行SQL查询.
load()有懒加载特性,会返加一个代理对象,所以永远不为null,先不执行SQL,要取对象的值时才执行SQL语句,前题session不能关闭,<class>标签上lazy不为false.

----------------------------------------------------------
实现懒加载的前提:1 PO不能是final的
2 能实现懒加载的对象(PO)都是被CGLIB改写的代理对象,所以不能是final修饰的
3 须要asm,cglib两个jar包
4 相应的lazy属性为true
5 相应的fetch属性为select
----------------------------------------------------------
什么时候出遇到懒加载
1 使用load()
2 一对一<one-to-one>
查主对象 默认使用join连接,不会发生懒加载
查从对象 默认会发生懒加载,先执行一句select查出从对象,当通过从对象访问了主对象时,再执行一句select查出主对象.

3 多对一<many-to-one>
在使用hbm.xnl时,取多的一方时,默认会懒加载,不取一的一方
在使用JPA时,取多的一方时,默认自动使用join on语句取出一的一方(用户与组,用户是多的一方,组是一的一方)

4 一对多(<set><list>)
默认会懒加载,这是必须的,是重常用的。

----------------------------------------------------------
实现懒加载的方案:


方法一:(没有使用懒加载)  
用 Hibernate.initialize(de.getEmps()) 提前加载一下.

方法二:
把与Session脱离的对象重新绑定
lock()方法是用来让应用程序把一个未修改的对象重新关联到新session的方法。

Java代码 复制代码 收藏代码
  1. //直接重新关联   
  2. session.lock(fritz, LockMode.NONE);   
  3. //进行版本检查后关联   
  4. session.lock(izi, LockMode.READ);   
  5. //使用SELECT ... FOR UPDATE进行版本检查后关联   
  6. session.lock(pk, LockMode.UPGRADE);  
//直接重新关联
session.lock(fritz, LockMode.NONE);
//进行版本检查后关联
session.lock(izi, LockMode.READ);
//使用SELECT ... FOR UPDATE进行版本检查后关联
session.lock(pk, LockMode.UPGRADE);




方法三:
OpenSessionInView
参见 http://www.iteye.com/topic/32001           
           
未完,待续

分享到:
评论

相关推荐

    hibernate 延迟加载深入剖析

    ### Hibernate延迟加载深入剖析 #### 一、概述 在现代软件开发中,特别是与数据库交互的应用场景下,Hibernate作为一款流行的Java持久层框架,提供了多种高效处理数据的技术。其中,延迟加载(Lazy Loading)是一...

    hibernate抓取策略和懒加载案例

    在Java的持久化框架Hibernate中,数据访问优化是至关重要的,而抓取策略(Fetch Strategy)和懒加载(Lazy Loading)则是实现这一目标的关键技术。本文将深入探讨这两个概念,并通过具体的案例进行分析。 首先,让...

    Hibernate lazy加载FOR Connection

    标签“源码”表明这个话题可能涉及到Hibernate框架的内部实现,包括其源代码分析,这可能涉及到了解Hibernate是如何实现懒加载机制的。而“工具”可能指的是Hibernate作为一种用于Java开发的关系型数据库管理工具。 ...

    hibernate结构框架及组要实现类的深入分析

    在深入分析 Hibernate 结构框架之前,我们先来了解一下核心概念。 **1. Hibernate 配置文件** Hibernate 的配置文件通常为 `hibernate.cfg.xml`,它定义了数据库连接、缓存、事务管理和映射文件的位置。例如,你...

    Hibernate lazy延迟加载

    深入理解Hibernate的懒加载机制,需要查看Hibernate的源码,包括`PersistentCollection`、`AbstractCollectionPersister`等关键类。在这些类中,可以看到Hibernate如何生成代理对象,以及在何时何地执行实际的SQL...

    Hibernate延迟加载

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

    hibernate的lazy策略forClass

    在压缩包文件`hibernate_lazy_for_class`中,可能包含了相关的代码示例、配置文件或日志文件,用于更深入地学习和分析Hibernate的懒加载策略在实际项目中的应用。通过阅读和分析这些资源,开发者可以更好地理解和...

    深入浅出Hibernate(含源码)

    12. **懒加载与立即加载**:Hibernate提供了懒加载机制,可延迟加载关联对象,以避免数据冗余和性能问题。立即加载则会在需要时立即获取关联对象。 13. **实体状态与生命周期**:Hibernate识别四种实体状态:瞬时、...

    hibernate源码分析

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

    深入浅出Hibernate完整版

    事务管理是任何数据库操作中不可或缺的一部分,文档不仅阐述了基于JDBC和JTA的事务管理策略,还深入分析了悲观锁和乐观锁的原理,帮助读者掌握如何在并发环境下正确地管理数据的一致性和完整性。 #### 分页与缓存...

    hibernate在单端关联上的lazy策略

    标签中的“源码”可能意味着博客深入探讨了Hibernate的内部实现,包括懒加载策略在源码中的体现和执行流程。而“工具”则可能涵盖了如何在实际项目中使用Hibernate的懒加载功能。 在压缩包文件“hibernate_lazy_for...

    hibernate源码分析一[启动过程]

    在深入探讨Hibernate框架的启动过程之前,我们首先需要了解几个核心的概念和类,它们是Hibernate启动流程的基石。 ### 1. 关键类与接口 #### Environment类 `Environment`类扮演着系统环境变量的关键角色,它定义...

    hibernate一键休眠,SDK程式源码

    本篇文章将深入探讨Hibernate一键休眠功能的实现原理,并通过提供的SDK源码进行详细分析。 一、Hibernate概述 Hibernate是一个开源的ORM框架,它允许开发人员使用面向对象的方式来操作数据库,避免了传统的SQL编程...

    hibernate在集合上的lazy策略

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

    Hibernate原理解析

    阅读和分析源代码是深入理解Hibernate原理的有效途径。 总之,Hibernate通过ORM简化了数据库操作,提升了开发效率,而对其原理的深入理解有助于我们更好地应用和优化这个强大的工具。通过不断的实践和探索,我们...

    hibernate 中的lazy属性祥解.txt

    在探讨Hibernate框架中的`lazy`属性时,我们深入解析了其功能、应用场景以及与之相关的潜在问题,尤其关注于如何有效利用此特性以优化数据库性能和应用响应速度。 ### Hibernate框架简介 Hibernate是一个开放源码...

    hibernate框架配置源码

    通过学习和分析`hibernateDay3`中的源码,你可以更深入地理解这些概念,并且能够熟练地配置和使用Hibernate框架。这将有助于提升你在实际项目中的开发效率,降低与数据库交互的复杂性。记住,实践是最好的老师,动手...

    Hibernate源码解析(一)

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

    hibernATE的源代码

    Hibernate是一个开源的对象关系映射(ORM)框架,它允许Java开发者将对象模型与...通过深入分析和学习Hibernate源代码,开发者不仅可以提高对ORM的理解,还能提升Java编程技巧,更好地应对实际项目中的数据访问挑战。

Global site tag (gtag.js) - Google Analytics