延迟加载依赖于数据库?

Lazy loading dependent on Database?

我们在设计为 3 层应用程序的应用程序中遇到了一个非常令人困惑的问题 * Spring-数据层中的Data JPA(1.8.2.RELEASE), Hibernate(4.3.10.Final) * Spring 服务层中的托管 Pojos(@Service beans) * GUI 层中的 Wicket (7.2.0)

我知道并且知道在 GUI 层中使用 JPA 托管 bean 时可能出现的问题(延迟加载、equals、哈希码等)。为了摆脱这种情况,我们使用 Wickets LoadableDetachableModels 在每个请求期间重新加载每个实体。

现在我们有一个页面,用户可以在其中 select 树中的实体。如前所述,实体封装在 LoadableDetachableModel 中。此实体与另一个实体有 1:n 关系。当 select 通过树访问实体时,正在访问 1:n 关系,导致众所周知的 org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: com.isb.bppm.wm.model.Product.children, could not initialize proxy - no Session 异常。

这非常令人困惑,因为这只发生在将 DB2 配置为数据库时。对于本地开发,我们在内存中使用 apache derby,其中相同的代码不会导致上述异常。到目前为止,我的分析将数据库作为两种配置之间的唯一区别。再说一下,我们对每个请求都使用Springs OpenEntityManagerInViewFilter,所以不会出现没有会话打开的情况。

你们中有没有人遇到过类似的问题,可以给我们提示可能出了什么问题?

感谢 Thorsten,我检查了我们的代码以查找未正确分离的模型。事实上,这是正确的暗示。我们自己的 LoadableDetachableModel 实现使用 equals 和哈希码,就像 org.apache.wicket.model.Model 一样。这导致模型对象在分离后立即被附加,因为记录器说模型对象已分离在日志注释中使用了模型的哈希码。

通过检查作为我们的 loadableDetachableModel 实现成员的实体 ID 来实现 equals 和 hashcode 来解决这个问题。这对我们来说很好,因为 ID 保证不会为空并且当然是唯一的。

无论如何问题仍然存在,为什么只更改数据库连接就发现了这个问题?