我正在使用Hibernate并且在我的应用中遇到LazyInitializationException问题。 这个问题可以通过Spring框架(一些注释,配置或其他东西)简单地解决,但我不知道这个框架,现在不想学习它(我只是初学者)。
这个问题已经很老了,所以我发现用OpenSessioninView模式可以解决它,但我敢打赌,有一种更简单的方法可以解决这个问题。
我的应用程序在最新的glassfish appliation服务器上运行,所以我想知道what the typical way to work with lazy initialization in EJB container?
答案 0 :(得分:0)
您可以将所有内容设置为EAGER并使用session.get而不是session.load,但我敢打赌,在视图中打开会话是更好的方法。
顺便说一句这正是SPring正在做的事情。你可以在这里看到Spring OpenSessionInView实现:
答案 1 :(得分:0)
这是你的问题:
“但我不知道这个框架,现在不想学习它(我只是初学者)。”
如果事情只是自动发生会很好,我们甚至不需要编写代码,但唉,事情并不总是很好。使用技术没有任何意义,但不想投入努力/学会使用它的机制。
有很多选择。
1)在视图中打开会话。花时间去做这件事。这并不难。它的作用是使会话在请求的生命周期内保持打开状态,因此如果您访问一个惰性关系,会话就在那里并且可以加载数据。 @ Danny.lesnik的回答是不正确的 - 从我读到的,他暗示OSiV只是让协会渴望,这不是它的作用。如果你不想使用Spring,你可以找到一个手工实现OSiV模式的例子,它不应该太糟糕,并且可能是一个很好的学习经验。
2)编写自定义映射/ hql,以便加载给定方案所需的所有数据。这并不是说加载所有对象;您可以从表中加载某些字段,以使获取尽可能精简。例如,您可以使您的hibernate / jpa映射/注释变得懒惰,然后编写一个自定义DAO方法,该方法仅在连接中的表中提取列之外的某些字段。对于一些调优/缓存/索引,这可能非常快。
在这两个选项中,1更容易,您只需要查看文档,它主要是配置。请注意,OSiV有其自身的复杂性,例如,如果您修改数据但有异常向用户显示结果,并且您的事务以某种方式配置,则您的修改将被回滚。选项2的优点是不需要OSiV及其所有相关的复杂功能,并且可以让您更好地控制与数据库的交互,并需要做更多的工作。