其实都是查询,只不过load()有延时加载
get方法不使用延迟加载机制,load采用延迟加载机制
如果没有满足条件的记录,get方法返回null,load则抛出异常
load方法返回的对象是一个动态代理类(Hibernate框架动态生成的,是实体类的子类型)。
get方法返回的对象类型就是原实体类型
延迟实现原理:
---在使用具有延迟加载机制API时,返回的是一个动态代理类型
首先动态在内存中创建的一个类
然后动态编译这个类,载入类加载器
---返回的动态代理类是原实体类型的一个子类。
---动态代理类重写了实体类的getter,检测是否加载数据库的数据,未加载进行数据库查询,然后返回该属性值。
假设有一个用户类,用户类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设置的控制,也就是说,集合的数据或引用的实体对象的数据,仍然不会立刻加载!)
简单地来说,就是只对普通属性的延迟加载有效,不包括集合和其他类属性。
用户登录
还没有账号?立即注册
用户注册
投稿取消
文章分类: |
|
还能输入300字
上传中....