避免Hibernate LazyInitializationExceptions的策略

7

除了使用OpenSessionInView模式,还有其他方法可以避免在Hibernate Web应用程序中出现LazyInitializationExceptions吗?使用OpenSessionInView会有什么不利影响吗?


Hibernate 4.1.6解决了这个问题:https://dev59.com/l3RB5IYBdhLWcg3wl4IQ#11913404 - andreak
4个回答

8
在开发我们的Web应用程序时,我们通常预先决定哪些对象/字段将在视图页面中使用,并确保在分派到视图之前从模型中正确初始化所有对象。

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

  1. 使用急切策略(即使用FetchMode.JOIN,如果您正在使用Criteria API)获取属性fetching
  2. 显式初始化属性(即使用Hibernate.initialize(property)
  3. 通过调用适当的属性访问器隐式初始化属性

关于OpenSessionInView的缺点,您是否查看了this页面?


5
通常处理此问题的最佳方式,而不是全局决定进行急切获取,是在 hql 查询中使用 "fetch" 关键字。
来自http://www.hibernate.org/hib_docs/reference/en/html/queryhql-joins.html
此外,“fetch”连接允许初始化关联或值集合以及其父对象,使用单个选择。在集合的情况下,这特别有用。它有效地覆盖了映射文件的外部连接和延迟声明,用于关联和集合。更多信息请参见第19.1节“提取策略”。
from Cat as cat inner join fetch cat.mate left join fetch cat.kittens

1

转向JBoss Seam。

Seam框架由Hibernate开发人员精心设计。

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

Hibernate已经智能地获取数据,更改提取模式将导致性能下降。不仅如此,而且您正在远离惯例,并将通过额外的配置细节混淆您的项目。

沃尔特


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接