Hibernate 的延迟加载

Hibernate 的延迟加载(lazy load)是一个被广泛使用的技术。这种延迟加载保证了应用只有在需要时才去数据库中抓取相应的记录。通过延迟加载技术可以避免过多、过早地加载数据表里的数据,从而降低应用的内存开销。Hibernate 的延迟加载本质上就是代理模式的应用,当程序通过 Hibernate 装载一个实体时,默认情况下,Hibernate 并不会立即抓取它的集合属性、关联实体所以对应的记录,而是通过生成一个代理来表示这些集合属性、关联实体,这就是代理模式应用带来的优势。

  但是,延迟加载也是项目开发中特别常见的一个错误。如果对一个类或者集合配置了延迟检索策略,那么必须当代理类实例或代理集合处于持久化状态(即处于Session范围内)时,才能初始化它。如果在游离状态时才初始化它,就会产生延迟初始化错误。所以,在开发独立的DAO数据访问层时应该格外小心这个问题。

  如果在获取对象的时候使用的是session.get()是不会延迟加载的,只有在使用load、hql时候才会延迟加载。

Hibernate中允许使用延迟加载的地方主要有以下几个地方:

<hibernate-mapping default-lazy=(true|false)”true”>:设置全局的延迟加载策略。

<class lazy=(true|false)>:DTD没设置默认值,推理默认值为true

<property lazy=(true|false)>:设置字段延迟加载,默认为false

<component lazy=(true|false):默认为false

<subclass lazy=(true|false)>:默认设置为true

<join-subclass lazy=(true|false)>:默认设置为true

<union-subclass lazy=(true|false)>:默认设置为true

<many-to-one lazy=(proxy|no-proxy|false)>:默认为proxy

<one-to-one lazy=(proxy|no-proxy|false)>:默认为proxy

<map lazy=(true|extra|false)>:默认为true

<set lazy=(true|extra|false)>:默认为true

<bag lazy=(true|extra|false)>:默认为true

<ibag lazy=(true|extra|false)>:默认为true

<list lazy=(true|extra|false)>:默认为true

时间: 2024-10-13 22:52:27

Hibernate 的延迟加载的相关文章

5、Hibernate的延迟加载

1.session.load(User.class,1); 一:了解懒加载 Session session = null; try { session = HibernateUtil.openSession(); User u = (User)session.load(User.class, 1); //此时一条sql都没有发,这就是hibernate的延迟加载 /** * 延迟加载指的就是,当完成load操作之后,并不会马山发出sql语句,只有在使用到该对象时才会发出sql * 当完成load

hibernate的延迟加载及其与session关闭的矛盾

延迟加载就是并不是在读取的时候就把数据加载进来,而是等到使用时再加载. 那么Hibernate是怎么知道用户在什么时候使用数据了呢?又是如何加载数据呢? 其实很简单,它使用了代理机制.返回给用户的并不是实体本身,而是实体对象的代理.代理对象在用户调用getter方法时就会去数据库加载数据. 但加载数据就需要数据库连接.而当我们把会话关闭时,数据库连接就同时关闭了.这种情况就叫做未初始化的关系. 延迟加载与session关闭的矛盾一般可以这样处理: 1).关闭延迟加载特性.     操作起来比较简

Hibernate的延迟加载问题

一.延迟加载及作用?    延迟加载又叫懒加载.是指在访问数据时,当数据用到的时候才被加载,没有被用到的时候不加载.二.这样做有什么好处呢?    好处就是每次访问数据的时候,因为只加载需要的数据,这样就可以降低数据库以及内存压力.    虽然说有时候整体的数据量并不多,但是这是一种机制,当数据量比较大的时候,对整体项目或者    方法调用的优化就会有明显的效果. 三.hibernate中get方法和load方法区别?    1.hibernate中,对于get方法,是立即加载的,也就是会立刻从

hibernate的延迟加载和抓取策略

一,延迟加载 1.实体类延迟加载 通过代理机制完成,由javassist类库实现运行时代理,修改实体类的字节码实现了运行时代理     <class lazy="true|false">     实体级别的延迟加载默认值为true,意味实体对象是延迟加载,只影响load方法.      <class lazy="true|false">其他查询方式都是立即加载              2.关联属性延迟加载 默认情况下除了<one-to

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中延迟加载和缓存

什么是延迟加载? 延迟加载是指当应用程序想要从数据库获取对象时(在没有设置lazy属性值为false),Hibernate只是从数据库获取符合条件的对象的OId从而生成代理对象,并没有加载出对象 访问该对象的属性时才会加载出相应的值.简答来说就是尽可能的减少查询的数据量. 如何配置延迟加载 在Hibernate中通过.hbm配置文件中的lazy属性来陪值,并且lazy属性出现的位置不同其作用和取值也不同.下面来详细介绍其在不同位置的不同取值和作用 类Class标签中的lazy: 在类标签Clas

Hibernate的延迟加载

我们会分析load和get两种加载方式: 一.load加载方式 当使用load方法来得到一个对象时,此时hibernate会使用延迟加载的机制来加载这个对象,即:当我们使用session.load()方法来加载一个对象时,此时并不会发出sql语句,当前得到的这个对象其实是一个代理对象,这个代理对象只保存了实体对象的id值,只有当我们要使用这个对象,得到其它属性时,这个时候才会发出sql语句,从数据库中去查询我们的对象. session = HibernateUtil.openSession();

关于hibernate的延迟加载问题

为什么需要延迟加载? 因为会提高效率嘛,存在即合理,哈哈.一般设置延迟加载就是在对象关系映射上(在多的一方).如下图: 一个用户有多个消费纪录. 设置成lazy后,查询数据的时候只会取出消费记录(多的一方),不会查询用户(这不就提高效率了吗,也就是关联数据不会查询数据库),但是另一个问题又来了,我要查询数据库的时候把关联的数据查询出来怎么办?如下图: 需要查询的时候将关联的数据再查询一次. 百度上是这么写的: 如果是EAGER,那么表示取出这条数据时,它关联的数据也同时取出放入内存中.(一次都查

Hibernate检索策略之延迟加载和立即加载

延迟加载:延迟加载(lazy load懒加载)是当在真正需要数据时,才执行SQL语句进行查询.避免了无谓的性能开销. 延迟加载分类:  1.类级别的查询策略 2.一对多和多对多关联的查询策略 3.多对一关联的查询策略 什么情况下使用延迟加载? 如果程序加载一个对象的目的是为了访问它的属性,可以采用立即加载.如果程序加载一个持久化对象的目的是仅仅为了获得它的引用,可以采用延迟加载. 如何配置延时加载? 在Hibernate中通过对.hbm的lazy属性来赋值,不同位置出现lazy的作用和取值也是不