【发布时间】:2016-05-03 20:14:28
【问题描述】:
我遇到了LazyInitializationException,然后我又遇到了官方doc下面的一段话。不幸的是,这对我来说完全没有意义。请帮忙。
(文档中段落上方的代码块。)
@GET
@Timed
@UnitOfWork
public Person findPerson(@PathParam("id") LongParam id) {
return dao.findById(id.get());
}
重要
Hibernate 会话在您的资源方法返回之前关闭 值(例如,数据库中的 Person),表示您的资源 方法(或 DAO)负责初始化所有延迟加载的 收藏等,在返回之前。否则,你会得到一个 LazyInitializationException 在您的模板中抛出(或空值 杰克逊制作)。
首先The Hibernate session is closed before your resource method’s return value。这怎么可能?如果我的资源的 return 语句周围有一个 try-finally 块,这是可能的,但这里不是这种情况。
我的资源应该被另一个方法调用了,我猜它会在我的资源方法被调用之前打开 Hibernate 会话,然后在我的资源方法返回后关闭会话。如何在我的方法返回之前关闭它。没看懂。
最重要的部分 - which means your resource method (or DAO) is responsible for initializing all lazily-loaded collections, etc., before returning. 我没有 Hibernate 经验。我现在是第一次使用它。我如何初始化,或者更确切地说,在 Hibernate 的上下文中“初始化”到底是什么意思?一个代码示例会有很大帮助。
PS:这个问题可能看起来很奇怪,粗略一看甚至可能会建议将其移至“英语语言和用法”,但请仔细阅读。这是一个技术问题,而不是段落剖析。
编辑: 从文档中添加了代码块,否则对任何人都没有意义。我还从我的问题中删除了一段,这对我来说很清楚,在发布问题后立即。
【问题讨论】:
-
它表示 Hibernate 会话在
findPerson返回之前关闭,因此dao负责初始化延迟加载的集合。阅读更多文档,我发现dao负责“大部分 SessionFactory 的常见操作”,其中大概包括打开会话。在我看来,如果您不熟悉 Hibernate 的工作原理,您对 Dropwizard 文档的期望过高,所以在您的情况下,我认为您必须阅读 Hibernate 文档或等待 LazyInitializationException 来进一步研究问题。
标签: java hibernate dropwizard