建议在实体中使用equals并避免使用LazyInitializationExceptions?

时间:2010-05-25 14:53:25

标签: java hibernate exception lazy-evaluation

一开始有一个问题需要解决。在我的情况下,我在一个Collection中使用indexof来检索一个Object进行操作时得到了一个LazyInitializationException。在这里,我开始考虑在EntityBeans中使用equals(根本就是OR-Mapper)。我知道有一些关于覆盖与OR-Mapper关联的equals的讨论就像hibernate一样

  

[1] Entities equals(), hashCode() and toString(). How to correctly implement them?

     

[2] To equals and hashcode or not on entity classes, that is the question.

     

[3] Overriding equals and hashCode in Java

我目前有一些实现equals的实体但在代码内部由于LazyInitializationExceptions而无法使用等于几次。所以我不得不解决并使用例如。用于标识其相等性的对象的name属性。从我的观点来看,在这个问题中并没有真正提到整个'LazyInitializationException-thing'。

我想知道你是否有一些好的模式或真实的实时建议如何避免这种异常的方法。我应该使用一些辅助方法来区分一个类的Object是否已经初始化(4),还是应该使用equals并使用辅助类代替(2)?那么在equals中捕获LazyInitializationExceptions是什么呢?


[编辑]:如果你在对象初始化的上下文中放置等于那么它将变得重要。有时,对象完全初始化是有必要的,但有时你不想这样做。因为你只需要Object本身(name,id,...)而不是它的Collection-Properties。那么只是为了均衡,你必须重新连接对象并加载你真正不需要的整个群?对于这样的问题还有其他解决方案吗?

1 个答案:

答案 0 :(得分:0)

LazyInitializationException和equals(),hashCode()等彼此没什么关系。当一个延迟加载的实体试图访问尚未加载的相关实体,并且该实体已从Session断开或逐出时,您可以进行LazyInitializationException。

有两个修复方法:

  1. 在关闭会话之前,急切地加载实体及其相关实体。
  2. 使用“在视图中打开会话”模式,在请求期间保持会话处于打开状态。
  3. 以下链接中讨论了这两种方法。