我们在我们的应用程序中面临一个非常令人困惑的问题,该问题被设计为使用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时可能出现的问题(延迟加载,等于,哈希码等)。为了摆脱这种情况,我们使用Wickets LoadableDetachableModels在每个请求期间重新加载每个实体。
现在我们有一个页面,用户可以在其中选择树中的实体。实体被封装在如上所述的LoadableDetachableModel中。该实体与另一个实体具有1:n的关系。通过树选择实体时,将访问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,因此永远不会发生没有打开会话的情况。
你们中是否有人遇到过类似的问题,可以给我们一些提示可能出错的提示?
答案 0 :(得分:0)
感谢Thorsten,我检查了代码中没有正确分离的模型。事实上,这是正确的暗示。我们自己的LoadableDetachableModel实现使用了equals和hashcode,就像org.apache.wicket.model.Model一样。这导致模型对象在分离后立即被附加,因为记录器说明modelobject被分离,在日志注释中使用了模型的哈希码。
通过检查作为我们的loadableDetachableModel实现的成员的实体ID来实现equals和hashcode,从而解决了这个问题。这对我们来说服务器很好,因为当然,ID保证不是空的并且是唯一的。
无论如何,问题仍然是为什么只更改数据库连接才发现这个问题?