在hibernate应用中,有时候只访问指定的持久化对象,在加载该对象时没有必要加载其关联的对象,以免浪费内存空间,但若想在Session关闭后正常访问该对象,必须在加载该对象时,一起加载该对象的关联对象,为了满足检索持久化对象的不同情况的需求,开发灵活高效的hibernate应用,hibernate提供的三种检索策略:立即检索、延迟检索(加载)和迫切连接检索。
在hibernate 3中为了提高效率、节省内存,默认的加载模式是延迟加载,也就是说没有在ORM配置文件中显示指定lazy参数的参数的话,laze的默认值是true,hibernate将默认为延迟加载,例如:有2个持久化对象:TTask和Tusers
其中TUsers是TTask的一个多对一的关联对象,TTask.hbm.xml中配置内容为:
<many-to-one name="TUsersByUserId" class="DAO.TUsers" fetch="select">
<column name="user_id" length="20" />
</many-to-one>
测试程序段:
public void test(){
Session session=HibernateSessionFactory.getSession();
Query q=session.createQuery("from TTask");
List list=q.list(); (1)
HibernateSessionFactory.closeSession();
for(int i=0;i<list.size();i++){
TTask t=(TTask)list.get(i);
System.out.println(t.getTUsersByCarryId().getUsername());(2)
}
}
会造成如下异常:
Exception in thread "main" org.hibernate.LazyInitializationException: could not initialize proxy - no Session
……
这是因为在运行到(1)出的时候没有查询TTask的关联对象TUser,之后Session关闭, 运行到(2)处时,由于session关闭,所以就抛出了异常。
延迟加载作为hibernate默认检索策略,所谓延迟加载就是在等到访问的时候才装载和初始化指定的对象,如果在Session实例关闭之前没有初始化延迟检索出来的对象session实例关闭后再访问时,就会抛出异常,因此在访问指定的对象前应确保该对象被成功实例化。
延迟加载主要可以用在:
Hibernate3.x,lazy默认是打开的
Hibernate Lazy策略使用:
<class>标签,可以取值true/false
<property>标签,可以取值true/false
<set><list>标签,可以取值true/false/extra
<one-to-one> <many-to-one>单端关联,可以取值:false/proxy/noproxy
load支持lazy,get不支持,无论持久化类设置与否,都会立即检索。
(1)class标签
<class name="className" lazy="true/alse">
默认为true
class上的Lazy,只对普通属性起作用,对集合和<one-to-one> <many-to-one>不起作用
即:如果一个类里有Set集合成员变量和需要用<one-to-one> <many-to-one>来映射的成员变量,即使在class里设置lazy为false,他们在使用之前也不会加载。需要单独设置lazy,也就是lazy的另外两个用法。
如果在使用load加载了某个对象,但是没有使用,即没有发出SQL语句,就把session给关了,此时,如果再使用这个对象就会抛出LazyInitalizationException。因为对象并没有加载上来,因为使用了lazy策略,只是加载了类的一个代理子类。
(2)集合
<set name="name" lazy="true/false/extra" >
默认为true
默认为true情况下,只要使用到了Set对象,就会把整个set全部查询出来。
false情况下,不使用Lazy,查询Lazy所属的对象时,set就会被查询上来。需要类增强工具。
extra情况下,比较智能,根据查询的内容,生成不同的SQL语句。效率会高一些。
(3)单端关联
<many-to-one name="name" lazy="false/proxy/noproxy">
默认为proxy
false:不使用Lazy。
noproxy:需要类增强工具
(4)property
<property name="name" lazy="true/false"/>
默认false
true:较少使用,如果某个字段是内容量比较大,可以设置为true,在真正使用的时候再加载。可以提高效率。
分享到:
相关推荐
### Hibernate延迟加载以及利用Spring #### 一、Hibernate延迟加载概念与原理 在理解Hibernate的延迟加载机制之前,我们首先需要了解什么是延迟加载。延迟加载(Lazy Loading)是一种设计模式,其核心思想是在真正...
### Hibernate延迟加载深入剖析 #### 一、概述 在现代软件开发中,特别是与数据库交互的应用场景下,Hibernate作为一款流行的Java持久层框架,提供了多种高效处理数据的技术。其中,延迟加载(Lazy Loading)是一...
《Hibernate延迟加载与代理模式解析》 在Java的持久化框架Hibernate中,延迟加载(Lazy Load)是一项重要的优化策略,其核心目标是提高系统性能,减少内存占用,避免不必要的数据库交互。延迟加载允许我们在需要...
### Hibernate延迟加载详解 #### 一、什么是延迟加载? 延迟加载是一种优化技术,在软件开发中广泛应用于各种场景,尤其在数据库交互中尤为重要。其核心思想是仅在确实需要某个资源时才加载它,而非一开始就加载...
详细介绍hibernate延迟加载,对hibernate初学者有一定的帮助
### Hibernate延迟加载详解 #### 什么是Hibernate延迟加载? 在探讨Hibernate延迟加载之前,我们先简要回顾一下Hibernate框架。Hibernate是一种流行的Java持久层框架,它提供了对象关系映射(ORM)的功能,允许...
【hibernate 延迟加载】 在Java的持久化框架Hibernate中,延迟加载(Lazy Loading)是一种优化数据库访问性能的技术。它允许我们在需要时才加载关联的对象,而不是在初始查询时就一次性加载所有数据。这有助于减少...
Hibernate延迟加载是ORM框架Hibernate中的一个重要特性,它旨在提高应用程序的性能和效率。延迟加载(Lazy Loading)策略允许我们仅在需要访问一个对象或其属性时才从数据库加载它们,而不是在初始加载实体时就一次...
Hibernate延迟加载机制.zip
### Hibernate 延迟加载技术详解 #### 一、概述 在 Hibernate 框架中,延迟加载(Lazy Loading)是一种非常重要的优化技术,它能够有效地减少数据库查询次数,提高应用性能。通常,在多对多或者一对多的关系中,...
《Hibernate延迟加载详解》 Hibernate作为Java领域中的一个强大的对象关系映射框架,提供了许多优化数据库操作的策略,其中之一便是延迟加载(Lazy Loading)。延迟加载机制旨在减少不必要的性能消耗,只在真正需要...
集合类型的延迟加载是Hibernate延迟加载机制中最能显著提升性能的部分。在Hibernate中,集合类型的延迟加载通过使用自定义的集合类实现,如`net.sf.hibernate.collection.Set`,而非标准的`java.util.Set`。这样,...
本案例主要探讨的是Hibernate的延迟加载(Lazy Loading)机制,这是一种优化数据库访问性能的重要策略。延迟加载允许我们在需要数据时才去加载,而不是在初始化对象时一次性加载所有关联数据,从而减少了内存消耗和...
本文将深入探讨几种解决Flex与Hibernate延迟加载问题的方法,并着重讲解使用Gilead的方案。 1. **LCDS的Hibernate Adapter**:Adobe LiveCycle Data Services (LCDS) 提供了一个Hibernate适配器,可以处理延迟加载...
Hibernate延迟加载是一种优化数据库操作的技术,它旨在减少不必要的数据库访问,从而提高应用程序的性能。当我们在Hibernate中使用延迟加载时,只有在实际需要数据时,才会从数据库中加载相关对象,而不是在初始加载...