`

解决hibernate中的lazy的问题

阅读更多
 <many-to-one name="TCustomerComeCategory" class="com.hnyxsm.modules.customer.TCustomerComeCategory" fetch="join">
//把fetch改成join就能解决 could not initialize proxy - the owning Session was closed这个问题
inner join(内连接)

left outer join(左外连接)

right outer join(右外连接)

full join (全连接,并不常用)

语句inner join, left outer join 以及 right outer join 可以简写。
from Cat as cat     join cat.mate as mate    left join cat.kittens as kitten

通过HQL的with关键字,你可以提供额外的join条件。
from Cat as cat     left join cat.kittens as kitten         with kitten.bodyWeight > 10.0

还有,一个"fetch"连接允许仅仅使用一个选择语句就将相关联的对象或一组值的集合随着他们的父对象的初始化而被初始化,这种方法在使用到集合的情况下尤其有用,对于关联和集合来说,它有效的代替了映射文件中的外联接 与延迟声明(lazy declarations).
from Cat as cat     inner join fetch cat.mate    left join fetch cat.kittens

一个fetch连接通常不需要被指定别名, 因为相关联的对象不应当被用在 where 子句 (或其它任何子句)中。同时,相关联的对象 并不在查询的结果中直接返回,但可以通过他们的父对象来访问到他们。
from Cat as cat     inner join fetch cat.mate    left join fetch cat.kittens child    left join fetch child.kittens

假若使用iterate()来调用查询,请注意fetch构造是不能使用的(scroll() 可以使用)。fetch也不应该与setMaxResults() 或setFirstResult()共用,这是因为这些操作是基于结果集的,而在预先抓取集合类时可能包含重复的数据,也就是说无法预先知道精确的行数。fetch还不能与独立的 with条件一起使用。通过在一次查询中fetch多个集合,可以制造出笛卡尔积,因此请多加注意。对bag映射来说,同时join fetch多个集合角色可能在某些情况下给出并非预期的结果,也请小心。最后注意,使用full join fetch 与 right join fetch是没有意义的。

如果你使用属性级别的延迟获取(lazy fetching)(这是通过重新编写字节码实现的),可以使用 fetch all properties 来强制Hibernate立即取得那些原本需要延迟加载的属性(在第一个查询中)。
from Document fetch all properties order by name
from Document doc fetch all properties where lower(doc.name) like ''%cats%''
通常情况下,我们并不使用映射文档进行抓取策略的定制。更多的是,保持其默认值,然后在特定的事务中, 使用HQL的左连接抓取(left join fetch) 对其进行重载。这将通知 Hibernate在第一次查询中使用外部关联(outer join),直接得到其关联数据。 在条件查询 API中,应该调用 setFetchMode(FetchMode.JOIN)语句。
 在没有使用Spring提供的Open Session In View情况下,因需要在service(or Dao)层里把session关闭,所以lazy loading 为true的话,要在应用层内把关系集合都初始化,如 company.getEmployees(),否则Hibernate抛session already closed Exception;    Open Session In View提供了一种简便的方法,较好地解决了lazy loading问题.    
    它有两种配置方式OpenSessionInViewInterceptor和OpenSessionInViewFilter(具体参看SpringSide),功能相同,只是一个在web.xml配置,另一个在application.xml配置而已。    
     Open Session In View在request把session绑定到当前thread期间一直保持hibernate session在open状态,使session在request的整个期间都可以使用,如在View层里PO也可以lazy loading数据,如 ${ company.employees }。当View 层逻辑完成后,才会通过Filter的doFilter方法或Interceptor的postHandle方法自动关闭session。
     OpenSessionInViewInterceptor配置
Xml代码 复制代码
  1.      
  2. <beans>    
  3. <bean name="openSessionInViewInterceptor" class="org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor">    
  4. <property name="sessionFactory">    
  5. <ref bean="sessionFactory"/>    
  6. </property>    
  7. </bean>    
  8. <bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">    
  9. <property name="interceptors">    
  10. <list>    
  11. <ref bean="openSessionInViewInterceptor"/>    
  12. </list>    
  13. </property>    
  14. <property name="mappings">    
  15. ...    
  16. </property>    
  17. </bean> ... </beans>   
  
<beans> 
<bean name="openSessionInViewInterceptor" class="org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor"> 
<property name="sessionFactory"> 
<ref bean="sessionFactory"/> 
</property> 
</bean> 
<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping"> 
<property name="interceptors"> 
<list> 
<ref bean="openSessionInViewInterceptor"/> 
</list> 
</property> 
<property name="mappings"> 
... 
</property> 
</bean> ... </beans> 

OpenSessionInViewFilter配置
Xml代码 复制代码
  1.     
  2. <web-app>    
  3. ...    
  4. <filter>    
  5. <filter-name>hibernateFilter</filter-name>    
  6. <filter-class> org.springframework.orm.hibernate3.support.OpenSessionInViewFilter </filter-class>    
  7. <!-- singleSession默认为true,若设为false则等于没用OpenSessionInView -->    
  8. <init-param>    
  9. <param-name>singleSession</param-name>    
  10. <param-value>true</param-value>    
  11. </init-param>    
  12. </filter> ... <filter-mapping>    
  13. <filter-name>hibernateFilter</filter-name>    
  14. <url-pattern>*.do</url-pattern>    
  15. </filter-mapping> ... </web-app>   
分享到:
评论

相关推荐

    hibernate 中的lazy属性祥解.txt

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

    Dwr+Hibernate的Lazy问题

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

    hibernate的lazy策略forClass

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

    hibernate在集合上的lazy策略

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

    解决Lazy最有效的方法

    在探讨“解决Lazy最有效的方法”这一主题时,我们深入剖析了Servlet中处理懒加载(Lazy Loading)的技术细节,特别是如何在Java环境下优化资源管理,确保应用性能与响应速度。以下将从标题、描述以及部分代码片段出发...

    Struts2+Spring+hibernate中对action的单元测试环境搭建[总结].pdf

    解决 JPA 中 Lazy 加载的问题,可以在 setUp() 函数中加入以下代码: ```java SessionFactory sessionFactory = lookupSessionFactory(request); Session hibernateSession = getSession(sessionFactory); ...

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

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

    hibernate中文文档

    Hibernate是一款强大的Java持久化框架,它为Java开发者提供了一种对象关系映射(ORM)解决方案,使得在Java应用中管理数据库变得更为简单。这个“hibernate中文文档”压缩包包含的是Hibernate框架的中文版API文档,...

    Hibernate 中文开发者文档

    以上内容只是Hibernate中文开发者文档的基础概述,实际文档会包含更详细的使用示例、最佳实践和解决常见问题的方法。通过深入学习,开发者能够熟练掌握Hibernate,提高开发效率,减少数据库操作的复杂性。

    如何解决hibernate自动更新实体类的问题共5页.pdf.zip

    在Java的持久化框架Hibernate中,自动更新实体类的问题是一个常见的困扰开发者的问题。当实体类的状态发生改变,Hibernate默认会尝试将这些变化同步到数据库,这在某些情况下并不符合我们的需求。本文将深入探讨这个...

    Hibernate中文参考文档 V3.2.chm

    通过《Hibernate中文参考文档 V3.2.chm》,开发者可以深入理解Hibernate的每个特性,解决实际开发中的问题,提升开发效率。无论是初学者还是经验丰富的开发者,都能从中受益,进一步提升自己的技能水平。这个文档...

    hibernate4.1中文官方文档

    Hibernate支持懒加载(Lazy Loading),意味着关联对象不会在初始化时立即加载,而是在需要时才从数据库中获取。对于一对多或多对多关系,可以使用`@OneToMany`和`@ManyToMany`注解进行映射,并通过`fetch`属性配置...

    Hibernate中文开发文档API.zip

    描述中提到的"Hibernate 参考手册中文API文档.chm"是一个帮助文件,通常包含详细的技术指南、类库参考和示例,旨在帮助开发者理解Hibernate框架的各种功能和用法。SSH框架是指Struts、Spring和Hibernate的组合,是...

    hibernate延迟加载解决

    要在Hibernate中启用实体对象的延迟加载,需要在映射文件中为相应的类添加`lazy="true"`属性,例如: ```xml &lt;class name="com.neusoft.entity.User" table="user" lazy="true"&gt; ... ``` **工作原理:** 当执行...

    Hibernate Fetch 的作用

    在Hibernate中,Fetch策略是解决数据加载时效率与灵活性的关键之一。 ### Hibernate Fetch策略详解 #### 1. Fetch策略概述 Fetch策略决定了如何加载实体及其关联的数据。在Hibernate中,主要有两种Fetch策略:...

Global site tag (gtag.js) - Google Analytics