用户登录
用户注册

分享至

hibernate lazyload

  • 作者: __森津幷
  • 来源: 51数据库
  • 2021-01-25
假设有一个用户类,用户类many-to-one指向一个地址类。

然后设置用户类级别为懒加载,many-to-one也是懒加载。

那么load一个用户类,用户类不会立即载入,当我们取用户的姓名时,
用户类载入了,但地址类仍然未载入。直到取地址相关属性时,地址类才载入。

如果是get一个用户类呢,用户类会立即载入,但是地址类确仍然是懒加载的。
直到取地址,地址才载入。

所以说用了get并不是说懒加载就完全失效了,只是对于直接操作的类会直接载入,
引用的类仍然按照配置懒加载。

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

很多人没有注意到,除了持久类的属性可以设置懒加载,持久类本身也可以设置。
而get和load的区别就在于get会忽视后者的设置,
直接载入实体类(但是不一定载入其集合属性和many-to-one,one-to-one属性)

下面是一篇参考文章。
------------------

在hibernate中,可以对类、普通属性、引用以及集合设置lazy属性,定义懒加载的特性。
Hibernate的懒加载,是通过在内存中对类、集合等的增强(即在内存中扩展类的特性[继承])来实现的,这些类通常称为代理类。

比如我们通过session.load(User.class,id)操作,加载一个对象的时候,hibernate返回的实际上是User的一个代理类实例(可通过IDE环境的debug模式运行程序,来观察其对象类型)。但如果通过session.get操作,则永远返回实际的对象实例(不是代理类实例),对上例而言,get操作永远返回User类的实例。

Class级别的lazy属性设置
我们可以对class元素定义lazy属性,它可以取值为true/false,默认值是true。这意味着,我们在使用session.load操作的时候,hibernate并不会立刻发出SQL查询语句去从数据库中加载对象的属性数据,直到我们调用对象的某个方法以获取某些属性的时候(比如getXXX()),hibernate才会向数据库发出查询语句加载数据,这种延迟特性,就称为懒加载。(我们可以通过实际的例子来观察这种特性)

Class级别的lazy属性设置对整个类的所有属性起作用,控制的是其拥有的属性的懒加载特性(但如果其属性为集合或对另外一个实体对象的引用,则集合或引用的懒加载特性不受class的lazy设置的控制,也就是说,集合的数据或引用的实体对象的数据,仍然不会立刻加载!)

简单地来说,就是只对普通属性的延迟加载有效,不包括集合和其他类属性。



  get 方法会无视lazy属性,无论lazy是true还是false。
hibernate执行get方法会立刻发出sql语句。
load遵循lazy属性。



  

·get方法是直接获取对象,如果要获取的对象不存在则返回null

·load方法是按需初始化给代理对象,如果要获取的对象不存在,会抛出异常

 

按需初始化?就是使用时才初始化。

譬如说:

cat cat=session.load(cat.class , 1);

transaction.commit();

这种情况下,cat是什么也没有,即null

要使cat真正的被初始化,需要使用cat,即调用cat的某一方法。

譬如:

cat cat=session.load(cat.class , 1);

system.out.println(cat.getid());

transaction.commit();

此时的cat才是一个真正cat对象。

这就是按需初始化。

 

 

 

 

 

 

 

软件
前端设计
程序设计
Java相关