0

我正在使用 Hibernate,并且在我的应用程序中遇到 LazyInitializationException 问题。这个问题可以通过Spring框架(一些注释,配置或其他东西)简单地解决,但我只是不知道这个框架,现在不想学习它(我只是初学者)。

这个问题已经很老了,所以我发现了如何使用OpenSessioninView模式来解决它,但我敢打赌有一种更简单的方法可以做到这一点。

我的应用程序正在最新的 glassfish 应用程序服务器上运行,所以我想知道what the typical way to work with lazy initialization in EJB container?

4

2 回答 2

0

您可以将所有内容设置为 EAGER 并使用 session.get 而不是 session.load,但我敢打赌,在视图中打开会话是更好的方法。

顺便说一句,这正是 SPring 正在做的事情。你可以在这里看到 Spring OpenSessionInView 的实现:

http://static.springsource.org/spring/docs/3.0.6.RELEASE/javadoc-api/org/springframework/orm/hibernate3/support/OpenSessionInViewFilter.html

于 2011-09-18T14:09:00.723 回答
0

这是你的问题:

“但我只是不知道这个框架,现在不想学习它(我只是初学者)。”

如果事情自动发生就好了,我们甚至不需要编写代码,但可惜事情并不总是好的。使用技术没有任何意义,但不想付出努力/学习使用它的机制。

有很多选择。

1) 在视图中打开会话。花时间来做这件事。这并不难。它的作用是在请求的生命周期内保持会话打开,因此如果您访问惰性关系,会话就在那里并且可以加载数据。@Danny.lesnik 的回答是不正确的——从我读到的内容来看,他暗示 OSiV 只是让联想变得渴望,这不是它的作用。如果不想用Spring,或许可以找个手工实现OSiV模式的例子,应该不会太差,大概是个不错的学习体验。

2) 编写自定义映射/hql,以便加载给定场景所需的所有数据。这并不是说加载所有对象;您可以从表中加载某些字段,以使提取尽可能精简。例如,您可以使您的 hibernate/jpa 映射/注释变得惰性,然后编写一个自定义 DAO 方法,该方法仅从连接中跨表的列中获取某些字段。使用一些调整/缓存/索引可以非常快。

在这两个选项中,1 更容易,您只需要查看文档,它主要是配置。请注意,OSiV 有其自身的复杂性,例如,如果您修改数据但向用户呈现结果时出现异常,并且您的事务以某种方式配置,您的修改将被回滚。选项 2 的优点是不需要 OSiV,但会带来所有的复杂性,并且可以让您更好地控制与数据库的交互,但必须做更多的工作。

于 2011-09-18T17:20:11.750 回答