`
duoerbasilu
  • 浏览: 1541664 次
文章分类
社区版块
存档分类
最新评论

hibernate 中lazy作用

 
阅读更多

转载:

HIBERNATE的持久化对象加载策略。
延迟加载, 也就是用到的时候才去加载.这样可以提高一些性能.
Hibernate
lazy loading 采用了一个HibernateSession来管理session,它的逻辑是每进行一次数据库操作,就开新的session,操作完成后立即关闭该session。这样做的好处是可以严格关闭session,避免菜鸟级的错误,但是hibernate.org并不推荐这么做。因为这不适合lazy loading,也不适合跨方法的事务。

比如在我们的应用中,user->post形成一对多的映射,User中有一个包含postList
User中,有多个属性:namepasswordphone等,还有一个List类型的posts。当我们对posts使用lazy laoding的时候,hibernate会在获得User对象的时候,仅仅返回name,password,phone等基本属性,当你访问posts的时候,它才会从数据库中提取posts需要的数据,这就是所谓lazy laoding。但是在我们的系统中,session是被立即关闭的,也就是在读取了name,password,phone等基本属性后,session已经close了,再进行lazy loaiding就会有异常。
解决办法是在close session之前,调用Hibernate.initialize(user.getPosts()),告诉系统,user.getPosts()是需要lazy laoding的。但是这样做会破坏HibernateSession类的封装.
后来采用所谓的OpenSessionInView模式,把session的周期交给servlet filter来管理,每当有request进来,就打开一个sessionresponse结束之后再关闭它,这样可以让session存在于整个请求周期中。

本文主要针对一对多情况下读取父类的子集合时,hibernate 的lazy属性在其中的影响进行总结。(以下代码运行在jdk1.5,jboss eclipse ide 1.5,hibernate 3.1环境下)
假设有:父类 Person (含有Set类型属性Address),
子类 Address(碰巧集合的名字和子类的名字都是Address,不要混淆了)
Person.hbm.xml 主要片段:
<id
name="idx"
column="idx"
type="long"
>
<generator class="identity">
</generator>
</id>
<property
name="age"
type="int"
update="true"
insert="true"
column="age"
/>
<property
name="name"
type="java.lang.String"
update="true"
insert="true"
column="name"
/>
<set
name="address"
table="address"
lazy="true"
cascade="none"
sort="unsorted"
>
<key
>
<column
name="personidx"
/>
</key>
<one-to-many
class="com.abc.common.pojo.Address"
/>

</set>
(1)在session 的周期内,无论lazy 设为true or false, 不会有任何限制。访问父子数据的代码如下所示 :
//打开session
session = HibernateUtil.currentSession();

PersonDAO dao = new PersonDAO();
Person person = null;

person = (Person)dao.findByPrimaryKey(4);
Set addressSet = person.getAddress();

Address[] addressAry = new Address[addressSet.size()];
Address address = null ;
addressSet.toArray(addressAry);

for(int i=0 ;i<addressAry.length;i++){
................
}
//session关闭
session.close();
if (session.isOpen()){
HibernateUtil.closeSession();
}

(2)在session的周期外,访问父子数据的代码如下所示 :
//打开session
session = HibernateUtil.currentSession();

PersonDAO dao = new PersonDAO();
Person person = null;

person = (Person)dao.findByPrimaryKey(4);
/**********************
*留待后续处理
*********************/
session.close();

//session关闭之后才访问person的子集
Set addressSet = person.getAddress();

Address[] addressAry = new Address[addressSet.size()];
Address address = null ;
addressSet.toArray(addressAry);

for(int i=0 ;i<addressAry.length;i++){
................
}
if (session.isOpen()){
HibernateUtil.closeSession();
}

此时,上述代码的运行结果根据lazy的设置的不同而不同
lazy=false
结果:可以访问得到Person和Address的数据
lazy= true
根据代码的写法有不同
(1)代码其他处不做任何处理,则抛出异常
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role:
。。。。。。
(2)如果做一些处理如下,将上述那段代码中的"留待后续处理"换成以下代码
Hibernate.initialize(person.getAddress()); 则可以访问得到Person和Address的数据
实际编写时,不会象上述这样的写法,即将
Hibernate.initialize(person.getAddress());和person.getAddress()在同一个方法里面调用。他们往往出现在应用程序的不同层次中(前者出现在DAO层居多,而后者则出现在web层居多).

分享到:
评论

相关推荐

    hibernate 中的lazy属性祥解.txt

    在探讨Hibernate框架中的`lazy`属性时,我们深入解析了其功能、应用场景以及与之相关的潜在问题,尤其关注于如何有效利用此特性以优化数据库性能和应用响应速度。 ### Hibernate框架简介 Hibernate是一个开放源码...

    hibernate的lazy策略forClass

    在Java的持久化框架Hibernate中,懒加载(Lazy Loading)是一种重要的对象关系映射策略,用于提高应用程序的性能。懒加载的基本思想是延迟加载,即当真正需要数据时,才去数据库加载。在这个场景中,我们关注的是...

    gilead hibernate lazyload例子

    这就是Hibernate懒加载(Lazy Load)机制的作用所在。懒加载是一种延迟加载策略,只在真正需要时才加载关联的数据,以减少内存消耗和提高响应速度。 Gilead,全称为Hibernate for Flex,是用于Flex和Hibernate之间...

    Dwr+Hibernate的Lazy问题

    标题中的"Dwr+Hibernate的Lazy问题"涉及到两个主要技术:Direct Web Remoting (DWR) 和 Hibernate。DWR 是一种让 JavaScript 在浏览器中直接调用服务器端 Java 方法的技术,而 Hibernate 是一个流行的Java持久化框架...

    Hibernate lazy延迟加载

    在Java的持久化框架Hibernate中,懒加载(Lazy Loading)是一种重要的优化策略,它的核心思想是“延迟加载”或“按需加载”。默认情况下,当一个实体被加载时,并不会立即加载其关联的对象或集合,而是在真正需要...

    Hibernate lazy加载FOR Connection

    标题中的“Hibernate lazy加载FOR Connection”指的是Hibernate框架中的一种特性,即懒加载(Lazy Loading)。在Hibernate中,懒加载是一种优化策略,它推迟对关联对象的加载,直到真正需要使用这些对象时才进行加载...

    Hibernate Fetch 的作用

    在Hibernate中,主要有两种Fetch策略:Eager(急切)和Lazy(懒惰)。默认情况下,Hibernate使用Lazy策略,这意味着关联对象不会立即加载,除非显式访问它们。这有助于提高应用程序的性能,因为不必要的数据不会被...

    hibernate在集合上的lazy策略

    在Java的持久化框架Hibernate中,懒加载(Lazy Loading)是一种优化策略,它允许我们推迟对关联对象的加载,直到真正需要它们的时候。标题“hibernate在集合上的lazy策略”指的是Hibernate如何处理与实体相关的集合...

    Hibernate延时加载与lazy机制.doc

    Hibernate的延迟加载(Lazy Loading)和懒加载机制(Lazy Initialization)是优化ORM框架性能的重要策略。这个机制的主要目的是提高程序的效率,减少不必要的数据库交互,只在真正需要数据时才去加载它们。以下是对...

    当设置lazy=true时,怎样使用extjs和Hibernate

    当我们设置Hibernate中的实体属性`lazy=true`时,这是懒加载(Lazy Loading)机制的体现。懒加载是一种优化策略,它允许我们在需要时才加载关联的对象,而不是在初始加载实体时就加载所有关联数据,从而提高性能。 ...

    hibernate中文参考文档pdf

    《Hibernate中文参考文档》是Java开发领域中关于Hibernate框架的重要学习资源,主要涵盖了Hibernate 3.6.10版本的相关内容。Hibernate是一个开源的对象关系映射(ORM)框架,它为Java开发者提供了一种在Java应用程序...

    hibernate 中 fetch=FetchType.LAZY 懒加载失败处理方法

    hibernate 中 fetch=FetchType.LAZY 懒加载失败处理方法 Hibernate 中 fetch=FetchType.LAZY 懒加载失败处理方法是 Hibernate 框架中的一种常见问题。当我们在 Hibernate 中使用懒加载特性时,可能会遇到 ...

    hibernate中文文档 HTML格式

    1. 实体(Entity):在Hibernate中,实体是Java类,它们代表数据库中的表。通过在实体类上使用`@Entity`注解来标识。 2. 表映射(Mapping):实体与数据库表之间的关系由Hibernate的XML配置文件(或使用注解)定义,...

    hibernate关联映射的作用和常用属性解释

    为了更好地理解和运用Hibernate中的关联映射机制,我们需要深入了解其常用的属性及其作用。 ##### 1. `&lt;class&gt;`元素 - **`name`**:指定类的完整包名,如`com.example.Person`。 - **`table`**:对应数据库中的...

    hibernate 3.6 中文 chm

    12. **延迟加载(Lazy Loading)**:为了提高性能,Hibernate支持属性和关联的延迟加载,即只有在真正需要时才加载数据。 13. **事件监听器**:Hibernate允许定义事件监听器来处理特定的数据库操作,如对象的保存、...

    hibernate中文文档

    6. **懒加载(Lazy Loading)**:为了提高性能,Hibernate支持懒加载机制,即关联的对象在需要时才从数据库加载,而不是在加载主体对象时一起加载。 7. **缓存(Caching)**:Hibernate集成了二级缓存机制,可以...

    hibernate_reference中文版和Hibernate中文手册

    《Hibernate参考指南中文版》与《Hibernate中文手册》是学习Java领域中ORM(对象关系映射)框架Hibernate的重要参考资料。Hibernate作为一个开源的、强大的持久化框架,极大地简化了数据库操作,使得开发人员能够以...

    hibernate在单端关联上的lazy策略

    标题中的“hibernate在单端关联上的lazy策略”指的是Hibernate框架中的一种对象关系映射(ORM)技术,用于优化数据加载效率。在Hibernate中,懒加载(Lazy Loading)是一种延迟加载策略,它允许我们在需要时才加载...

    hibernate

    根据提供的文件信息,我们可以深入探讨Hibernate框架中的几个关键概念,特别是`fetch`, `lazy`, `cascade`, 和 `inverse`关键字的使用与理解。这四个概念在处理对象关系映射(ORM)时非常重要,尤其是在Java环境下...

    Hibernate中文API大全

    注意:在Hibernate3中,第二个要求并非是Hibernate强制必须的。但最好这样做。 你不能使用一个IdentifierGenerator产生组合关键字。一个应用程序必须分配它自己的标识符。 使用&lt;composite-id&gt; 标签(并且内嵌元素...

Global site tag (gtag.js) - Google Analytics