避免Hibernate LazyInitializationExceptions的策略

时间:2008-10-18 23:52:30

标签: java database hibernate

除了使用OpenSessionInView模式之外,还有其他方法可以避免Hibernate Web应用程序中的LazyInitializationExceptions吗?使用OpenSessionInView有什么缺点吗?

4 个答案:

答案 0 :(得分:8)

在处理我们的Web应用程序时,我们通常会事先决定在视图页面中需要哪些对象/字段,并确保在分派到视图之前从模型中正确初始化所有对象。

这可以通过(至少)三种方式实现:

    使用热切策略的
  1. fetching属性(例如,使用FetchMode.JOIN,如果您使用的是Criteria API
  2. 明确初始化属性(即使用Hibernate.initialize(property)
  3. 通过调用适当的属性访问器隐式初始化属性
  4. 关于OpenSessionInView的缺点,您是否已查看this页?

答案 1 :(得分:5)

通常是处理问题的最佳方式,而不是做出全球决定进行急切的提取;是使用“fetch”关键字与hql查询结合使用。

来自http://www.hibernate.org/hib_docs/reference/en/html/queryhql-joins.html

此外,“fetch”连接允许使用单个select来初始化值的关联或集合及其父对象。这在集合的情况下特别有用。它有效地覆盖了关联和集合的映射文件的外连接和延迟声明。有关更多信息,请参见第19.1节“获取策略”。

来自Cat作为猫     内联接获取cat.mate     left join fetch cat.kittens

答案 2 :(得分:1)

切换到JBoss Seam。

Seam框架很好地由开发Hibernate的人构建。

即使使用View中的Open Session,您仍可能遇到一些问题。根据Web应用程序的复杂程度,Open Session In View不会处理所有情况。我在显示数据时(在UI中)也遇到了在石英作业(例如发送电子邮件)期间获取实体的问题。

Hibernate已经智能地获取数据,更改获取模式将导致性能下降。不仅如此,您还远离惯例,并且会通过无关的配置细节来破坏您的项目。

沃尔特

答案 3 :(得分:0)

Oracle Java教程指出“Enterprise Bean支持事务,即管理共享对象并发访问的机制。”因此,为了处理Lazy Fetch问题,我创建了一个无状态Java会话Bean,然后在从方法返回之前获取我需要的所有子类。 Oracle还将此称为“SessionFaçade”核心J2EE模式。这些实践似乎比其他提到的实践更好。