Hibernate一对一,一对多懒加载的要求

懒加载要求Domain对象不能是final的,因为Hibernate需要生成一个继承自该Domain对象的类来实现懒加载。懒加载主要有三种:

1. 对象的懒加载

2. 关联集合的懒加载

3. 对象属性的懒加载

对象的懒加载

对象的懒加载就是在映射文件的class标签中设置lazy属性为true,这时,如果用session.load方法获取这个对象的话,Hibernate只返回一个代理对象,而不是真的去查询数据库,等到真正用到这个对象的时候,Hibernate才会去查询数据库。

关联集合的懒加载

关联集合的懒加载有多种:

1. 一对一映射懒加载

在一对一映射中,查询主对象时,Hibernate是不进行懒加载的,即使在映射文件中设置了主对象的从对象的lazy属性为proxy。在查询从对象时,必须要满足三个条件才能实现懒加载:

(1)从对象的映射文件中一对一映射的lazy属性不能设置成false;

(2)从对象的映射文件中一对一映射的constrained属性要设置成true;

(3)从对象的映射文件中一对一映射的fetch属性要设置成select。

第一条是设置是否采用懒加载,设置成false当然就不能实现懒加载了,可以设置成proxy和no-proxy两种;constrained属性设置成
true是为了建立从对象表主键与主对象主键的外键关系的。如果这个属性设置成false,那么数据库里就不能保证主对象表里一定有一条记录与从对象表里
的记录相对应,Hibernate也就不知道从对象里的主对象属性是应该赋成null还是赋成一个代理对象,所以就只能把主对象的记录也查询一下才能确
认,这样就无法应用懒加裁了,这也是查询主对象时无法应用懒加载的原因;fetch属性可以设置成select和join两种,select是指查询主对
象是通过另一条select语句去查询。如果设置成join,也就是说在取从对象的时候会inner
join一下主对象,如果是这样的话,Hibernate就会直接把主对象信息取出来,自然也不需要懒加载了。

2. 一对多映射懒加载

一对多映射时分两种情况,一是查询一对象时的懒加载;二是查询多对象时的懒加载。

先说查询多对象时的懒加载。不像一对一映射查询主对象,默认时查询一个多对象时Hibernate也是会采用懒加载的。<many-to-one>标签需要两个属性设置,一是lazy不能设置成false;二是fetch不能设置为join。道理与前面一样。而这两个属性的默认值lazy是proxy、fetch是select,所以默认是进行懒加载的。

查询一对象时,默认也是懒加载的。这回设置属性应该是在集合标签里,而不是<one-to-many>标签里。并且lazy的值可以设置成true、false和extra三种,而不是之前的false、proxy和no-proxy三种。extra一种比较聪明的懒加载策略,如果调用集合的size/contains等方法的时候,hibernate并不会去加载整个集合的数据,而是发出一条适当的SQL语句,以便获得需要的值,只有在真正需要用到这些集合元素对象数据的时候,才去发出查询语句加载所有对象的数据。若要应用懒加载,应该设置lazy属性为true或extra;并且fetch属性要设置成select。

3. 多对多映射懒加载

多对多映射的懒加载与一对多映射懒加载在集合标签上的设置是相似的,lazy属性也有true、false和extra三个选项。

对象属性的懒加载

Hibernate还支持对象属性的懒加载。应用的情况比较少,而且应该在设计上避免出现这种情况

Hibernate一对一,一对多懒加载的要求,布布扣,bubuko.com

时间: 2024-10-05 04:58:40

Hibernate一对一,一对多懒加载的要求的相关文章

hibernate 一对一关联关系 及其懒加载,总结

一对一,则有主对象和从对象之区别 若无主对象,则从对象亦无存在之意义. 主对象为person 从对象为idcard <hibernate-mapping package="cn.itcast.hibernate.domain"> <class name="Person"> <id name="id"> <generator class="native" /> </id>

Hibernate中的延迟加载(懒加载)

什么是懒加载? Hibernate提供了一种机制,即在设置了使用懒加载的情况下,查询某一条数据时不会立即访问数据库,因此不会返回指定对象,而是返回代理对象,该代理对象并不为null,它实际上是Hibernate自动实现的指定对象所属类的子类的对象,该对象具有默认值.当要使用真正对象的属性的时候才会访问数据库,这时代理对象会自动查询数据库中对应对象的数据并返回. 这样一来降低了程序对数据库访问次数和内存使用量.下面我们通过懒加载适用情况分析它究竟是如何做到的. 懒加载的适用情况? 1.获取某一个对

Hibernate get对象的懒加载问题

org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.wolf.a_StudentManageSystem.domain.Teacher.courses, could not initialize proxy - no Session at org.hibernate.collection.internal.AbstractPersistentCollect

Hibernate学习笔记(八) — 懒加载与抓取策略

懒加载(Load On Demand)是一种独特而又强大的数据获取方法,它能够在用户滚动页面的时候自动获取更多的数据,而新得到的数据不会影响原有数据的显示,同时最大程度上减少服务器端的资源耗用.总结一句话:什么时候需要数据,什么时候加载. 一.懒加载 1.1 类的懒加载 由javassist产生的代理类与Classes类是继承关系, session.load()方法产生的是代理对象,该代理类是持久化类的子类 /** * 类的懒加载 */ @Test public void testClass_l

Hibernate 性能优化之懒加载

针对数据库中的大数据,不希望特别早的加载到内存中,当用到它的时候才加载 懒加载分为:类的懒加载.集合的懒加载.单端关联的懒加载 类的懒加载    1.在默认情况下,类就是执行懒加载        2.只有使用了load方法以后才能用懒加载    3.如果在相应的映射文件中,设置<class>的lazy="false"懒加载将失去效果集合的懒加载     1.针对一多对的情况或者多对多的情况    2.根据一方加载set集合,决定在什么时候给set集合填充数据        

Hibernate(九)__OpenSessionInView解决懒加载问题

什么是OpenSessionInView? 在hibernate中使用load方法时,并未把数据真正获取时就关闭了session,当我们真正想获取数据时会迫使load加载数据,而此时session已关闭,所以就会出现异常. 比较典型的是在MVC模式中,我们在M层调用持久层获取数据时(持久层用的是load方法加载数据),当这一调用结束时,session随之关闭,而我们希望在V层使用这些数据,这时才会迫使load加载数据,我们就希望这时的session是open着得,这就是所谓的Open Sessi

Hibernate的延迟加载 ,懒加载,lazy

Hibernate延迟加载有很多配置方法,本文主要说明几种常用的配置方法,以及在Session的get()和load()方法,Query对象的iterator()和list()方法中的效果.下面是本例用到的两张表.实体类和配置信息: Company表: Employee表(employee_company_id为外键) Company实体类: import java.util.Set; public class Company {    private int companyId;    pri

hibernate懒加载(转载)

http://blog.csdn.net/sanjy523892105/article/details/7071139 懒加载详解 懒加载为Hibernate中比较常用的特性之一,下面我们详细来了解下懒加载的原理和注意事项 Load()方法的懒加载原理 在Hibernate中,查询方法有两个,分别是get()和load(),这两种方法的不同就是load()拥有懒加载的特性.Load()方法就是在查询某一条数据的时候并不会直接将这条数据以指定对象的形式来返回,而是在你真正需要使用该对象里面的一些属

Hibernate学习笔记-懒加载Lazy-true

1. 懒加载概述以及使用情景 描述:懒加载(lazy),简单说就是延时.延迟加载. 情景:在Hibernate框架应用中,就是当我们要访问的数据量过大时,使用缓存并不太合适,因为内存容量有限 ,为了减少系统资源的消耗,减少并发量,这时需要用懒加载机制来弥补这种缺陷,但是这并不意味用了懒加载总体性能就提高了. 应用: 比如学校school和学生student,学校与学生1对多,如果lazy设置为 false,那么只要加载了一个学校的信息,就会根据一对多配置的关系把所有学生的信息也加载出来.但是实际