最近我们的项目经常报一个延迟加载错误org.hibernate.LazyInitializationException: could not initialize proxy - the owning Session was closed,在网上看了好多资料,现在在这里总结一下:
一 hibernate加载策略
Hibernate的检索策略包括类级别检索策略和关联级别检索策略。
类级别检索策略有立即检索和延迟检索,默认的检索策略是立即检索。在Hibernate映射文件中,通过在<class>上配置 lazy属性来确定检索策略。对于Session的检索方式,类级别检索策略仅适用于load方法;也就说,对于get、qurey检索,持久化对象都会被立即加载而不管lazy是false还是true.一般来说,我们检索对象就是要访问它,因此立即检索是通常的选择。由于load方法在检索不到对象时会抛出异常(立即检索的情况下),因此我个人并不建议使用load检索;而由于<class>中的lazy属性还影响到多对一及一对一的检索策略,因此使用load方法就更没必要了。
关联级别检索策略有立即检索、延迟检索和迫切左外连接检索。对于关联级别检索,又可分为一对多和多对多、多对一和一对一两种情况讨论。
一对多和多对多关联关系一般使用<set>配置。<set>有lazy和outer-join属性,它们的不同取值绝对了检索策略。
1)立即检索:这是一对多默认的检索策略,此时lazy=false,outer-join=false.尽管这是默认的检索策略,但如果关联的集合是无用的,那么就不要使用这种检索方式。
2)延迟检索:此时lazy=true,outer-join=false(outer-join=true是无意义的),这是优先考虑的检索方式。
3)迫切左外连接检索:此时 lazy=false,outer-join=true,这种检索策略只适用于依靠id检索方式(load、get),而不适用于query的集合检索(它会采用立即检索策略)。相比于立即检索,这种检索策略减少了一条sql语句,但在Hibernate中,只能有一个<set>配置成 outer-join=true.
多对一和一对一检索策略一般使用<many-to-one>、<one-to-one>配置。<many- to-one>中需要配置的属性是 outer-join,同时还需要配置one端关联的<class>的lazy属性(配置的可不是<many-to-one>中的lazy哦),它们的组合后的检索策略如下:
1) outer-join=auto:这是默认值,如果lazy=true为延迟检索,如果lazy=false为迫切左外连接检索。
2) outer-join=true,无关于lazy,都为迫切左外连接检索。
3) outer-join=false,如果lazy=true为延迟检索,否则为立即检索。
可以看到,在默认的情况下(outer-join=auto,lazy=false),对关联的one端对象Hibernate采用的迫切左外连接检索。依我看,很多情况下,我们并不需要加载one端关联的对象(很可能我们需要的仅仅是关联对象的id);另外,如果关联对象也采用了迫切左外连接检索,就会出现select语句中有多个外连接表,如果个数多的话会影响检索性能,这也是为什么Hibernate通过 hibernate.max_fetch_depth属性来控制外连接的深度。对于迫切左外连接检索,query的集合检索并不适用,它会采用立即检索策略。
对于检索策略,需要根据实际情况进行选择。对于立即检索和延迟检索,它们的优点在于select语句简单(每张表一条语句)、查询速度快,缺点在于关联表时需要多条select语句,增加了访问数据库的频率。因此在选择即检索和延迟检索时,可以考虑使用批量检索策略来减少select语句的数量(配置batch-size属性)。对于切左外连接检索,优点在于select较少,但缺点是select语句的复杂度提高,多表之间的关联会是很耗时的操作。另外,配置文件是死的,但程序是活的,可以根据需要在程序里显示的指定检索策略(可能经常需要在程序中显示指定迫切左外连接检索)。为了清楚检索策略的配置效果如何,可以配置show_sql属性查看程序运行时Hibernate执行的sql语句。
二 解决办法:
1 在WEB级别应用时候,会出现意想不到的lazy错误,解决方法就是 设置 lazy="false" 例:
<hibernate-mapping>
<class name="com.jeedev.hb.TSysuser" table="t_sysuser" lazy="false">
单我觉的这样有一定的局限性,内存消耗较大
2 在controller 里强制加载需要的对象,主要是级联的对象:
Hibernate.initialize(user.getSingleperson()); user与singleperson是多对多的关系,两个<many-to-one>
实际中是一对一的,只不多user还有其他类型的用户,所以这样配置
org.hibernate.Hibernate.initialize(user.getSingleperson());
分享到:
相关推荐
本文将深入探讨几种解决Flex与Hibernate延迟加载问题的方法,并着重讲解使用Gilead的方案。 1. **LCDS的Hibernate Adapter**:Adobe LiveCycle Data Services (LCDS) 提供了一个Hibernate适配器,可以处理延迟加载...
### Hibernate延迟加载深入解析 #### 一、概念与原理 **延迟加载**(Lazy Loading)是Hibernate框架中的一个重要特性,主要用于优化数据库操作,减少不必要的数据加载,从而提升应用程序的性能。在传统的Eager ...
在Hibernate中,集合属性的加载方式有两种:即刻加载(eager loading)和延迟加载(lazy loading)。默认情况下,Hibernate采用即刻加载的方式加载集合属性。这种方式虽然简化了代码编写,但可能会导致额外的数据库...
Flex客户端需要捕获并处理可能出现的服务器端异常,并且确保在分布式环境中,数据库操作的原子性和一致性。 6. **缓存策略**:为了提高性能,可以利用Hibernate的二级缓存机制,以及在Flex客户端对数据进行适当的...
9. **`LazyInitializationException`的另一种情况:** 在JPA中,如果你的实体类有一个懒加载的集合属性,而该属性在JSON序列化时被访问,也会抛出此异常。解决方案包括在序列化前手动加载懒加载属性,或者使用能处理...
8. **Criteria查询的优势**:QBC具有良好的类型安全性和编译时检查,减少了运行时错误的可能性。同时,其代码结构清晰,易于阅读和维护。 通过深入学习和实践“Hibernate QBC高级查询”,开发者可以更高效、灵活地...
10. **性能优化**:探讨Hibernate的性能优化策略,如批处理、延迟加载、缓存机制等。 在hibernate-doc.rar中,通常会有更详细的文档资料,这些文档可能涵盖: 1. **API参考**:详尽的Hibernate API文档,帮助...
7. **性能优化**:Hibernate EM允许开发者进行细粒度的性能调优,例如批处理操作、延迟加载、结果集缓存等,以适应不同的性能需求。 8. **多数据源支持**:在3.3.1.GA版本中,Hibernate EM可能已经支持连接多个数据...
5. **性能优化**:分析可能影响Hibernate性能的因素,并提供优化建议,如延迟加载、批处理和结果集映射。 6. **事务管理**:深入理解JTA(Java Transaction API)和Hibernate的事务处理机制,学习如何在分布式环境...
2. **Hibernate 3 提供了属性级别的延迟加载功能:** 在查询数据时,数据并不会立即加载到内存中;只有在程序真正需要对数据进行操作时,对象才会加载到内存中。这种方式节省了服务器的内存开销,提高了服务器性能。...
在Java Hibernate框架中,HQL(Hibernate Query Language)是一种面向对象的查询语言,用于操作和查询关系数据库。HQL与SQL类似,但更专注于对象和它们的属性,而不是数据库表格和列。在使用HQL进行数据库查询时,有...
spring中读取xml配置文件、获取bean的几种方式** - 通过`ApplicationContext`接口的`newClassPathXmlApplicationContext(String[] configLocations)`方法加载配置文件。 - 使用`BeanFactory`的`new XmlBeanFactory...
由于它支持Hibernate的延迟加载对象,因此在处理ORM框架生成的对象时尤其有用,避免了因序列化导致的未初始化懒加载对象的错误。同时,通过反射处理,它可以处理任何具有公共getter方法的Java对象,使得通用性更强。
9. **错误处理和异常处理**:在开发过程中,正确处理可能出现的异常和错误是必不可少的,例如数据库连接问题、数据验证失败等。 10. **单元测试**:为了确保系统的稳定性和可靠性,开发者可能编写了针对NHibernate...
因此,了解ORM的内部工作原理,进行合理的配置和使用,如延迟加载、缓存机制等,可以有效提高性能。 6. **连接池管理**:ORM框架通常内置了数据库连接池,如Hibernate的C3P0或HikariCP,这有助于减少数据库连接的...
Hibernate提供了两种延迟加载机制,一种是Hibernate2延迟加载实现,另一种是Hibernate3提供的属性延迟加载功能。 3、Hibernate中怎样实现类之间的关系? 类与类之间的关系主要体现在表与表之间的关系进行操作,...
97、Hibernate是如何延迟加载? 22 98、Hibernate中怎样实现类之间的关系?(如:一对多、多对多的关系) 22 99、说下Hibernate的缓存机制 22 100、Hibernate的查询方式 23 101、如何优化Hibernate? 23 102、Struts工作...
4. 错误处理和进度显示:在上传或下载多媒体文件时,AJAX可以实时反馈进度信息,同时处理可能出现的错误,提升用户对系统稳定性的感知。 5. 优化用户体验:通过减少不必要的页面跳转,AJAX使得网络多媒体课件的导航...
- **Hibernate的延迟加载**:Hibernate支持懒加载(Lazy Loading)技术,它通过动态代理机制实现。当加载实体时,并不会立即加载关联的集合,而是返回一个代理对象`PersistentSet`,并持有一个`HibernateSession`...