Hibernate懒加载的初步分析

懒加载可以提高性能吗?

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

----------------------------------------------------------

Hibernate的lazy属性可以配置在:

(常用)标签上,可以取值true,false,extra

默认为true,当为true时,会懒加载,访问集合属性时再发出SQL语句.但set.size()时,很不智能,不会生成count()语句,而是查出所有记录赋值给set.

extra说明:调用集合的set.size()时,会生成select count(*)from tableName,比较智能.建议使用

(少用)标签上,可以取值false,proxy,noproxy

当为true时,会有懒加载特性,当为false时会产生N+1问题,比如一个学生对应一个班级,用一条SQL查出10个学生,当访问学生的班级属性时Hibernate会再产生10条SQL分别查出每个学生对应的班级.

(不用)标签上,可以取值true,false

默认为true,当为false时,load()方法将失去懒加载的特性与get()一样,不影响集合()标签上的lazy特性

(不用)标签上,可以取值true,false

默认值为false,懒加载某个字段,无意义,不要使用

----------------------------------------------------------

get()与load()的区别

get()无懒加载特性,马上执行SQL查询.

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

----------------------------------------------------------

实现懒加载的前提:1 PO不能是final的

2 能实现懒加载的对象(PO)都是被CGLIB改写的代理对象,所以不能是final修饰的

3 须要asm,cglib两个jar包

4 相应的lazy属性为true

5 相应的fetch属性为select

----------------------------------------------------------

什么时候出遇到懒加载

1 使用load()

2 一对一

查主对象默认使用join连接,不会发生懒加载

查从对象默认会发生懒加载,先执行一句select查出从对象,当通过从对象访问了主对象时,再执行一句select查出主对象.

3 多对一

在使用hbm.xnl时,取多的一方时,默认会懒加载,不取一的一方

在使用JPA时,取多的一方时,默认自动使用join on语句取出一的一方(用户与组,用户是多的一方,组是一的一方)

4 一对多()

默认会懒加载,这是必须的,是重常用的。

----------------------------------------------------------

实现懒加载的方案:

方法一:(没有使用懒加载)

用 Hibernate.initialize(de.getEmps()) 提前加载一下.

方法二:

把与Session脱离的对象重新绑定

lock()方法是用来让应用程序把一个未修改的对象重新关联到新session的方法。

Java代码

//直接重新关联

session.lock(fritz, LockMode.NONE);

//进行版本检查后关联

session.lock(izi, LockMode.READ);

//使用SELECT ... FOR UPDATE进行版本检查后关联

session.lock(pk, LockMode.UPGRADE);

方法三:

OpenSessionInView

【科多大数据下次为你介绍】


http://www.101test.com/cand/index?paperId=IPBAKU

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Hibernate: 一个持久化框架 一个ORM框架 加载:根据特定的OID,把一个对象从数据库加载到内存中OID...
    JHMichael阅读 2,015评论 0 27
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,785评论 18 399
  • 本文包括:1、Hibernate 的查询方式2、HQL (Hibernate Query Language) 查询...
    廖少少阅读 2,689评论 0 15
  • Hibernate中配置主要分为两种:一种包含了Hibernate与数据库的基本连接信息,在Hibernate工作...
    FTOLsXD阅读 2,162评论 0 10
  • 找到那个爱你的人了吗,又到还有99 天就到一起跨年的时间了,本来平常的日子,却硬是被那些不安寂寞的单身狗搞了...
    汪不器阅读 180评论 0 0