【问题标题】:Recommendation for using equals in Entities and avoiding LazyInitializationExceptions?建议在实体中使用 equals 并避免 LazyInitializationExceptions?
【发布时间】:2011-02-23 17:59:53
【问题描述】:

一开始有一个问题想要解决。在我的情况下,我在 Collection 中使用 indexof 来检索对象进行操作时遇到了 LazyInitializationException。在这里,我开始考虑在 EntityBeans 中使用 equals(完全是 OR-Mapper)。我知道有一些关于覆盖与 OR-Mapper 相关的等于作为休眠的讨论

[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,在代码中我无法多次使用 equals。所以我不得不解决并使用例如。对象的 name 属性以标识它的相等性。从我的角度来看,这个问题并没有真正提到整个“LazyInitializationException-thing”。

我想知道您是否有一些好的模式或真实的建议,如何在 equal-Method 中避免此类异常。我应该使用一些辅助方法来区分一个类的对象是否已经初始化(4)还是应该使用 equals 并使用辅助类(2)?在 equals 中捕获 LazyInitializationExceptions 是什么意思?


[编辑]:如果你把 equals 放在对象初始化的上下文中,那么它就会变得重要。有时需要完全初始化对象,但有时您不想这样做。因为您只需要对象本身(名称、id、...)而不是其集合属性。所以只是为了均衡,你必须重新连接对象并加载你不需要的全部?对于这样的问题,还有其他解决方案吗?

【问题讨论】:

    标签: java hibernate exception lazy-evaluation


    【解决方案1】:

    LazyInitializationException 和 equals()、hashCode() 等相互关系不大。当延迟加载的实体尝试访问尚未加载的相关实体,并且该实体已从 Session 断开连接或逐出时,您可以抛出 LazyInitializationException。

    对此有两个修复:

    1. 在关闭会话之前急切地加载实体及其相关实体。
    2. 使用“在视图中打开会话”模式在请求期间保持会话打开。

    下面的链接中讨论了这两种方法。

    【讨论】:

    • 如果你把 equals 放在 Object 初始化的上下文中,那么它就会变得很重要。有时需要完全初始化对象,但有时您不想这样做。因为您只需要对象本身而不是其集合属性。所以只是为了均衡你必须重新附加对象并加载你不需要的东西?所以我试图找出是否有人找到了解决此类问题的其他解决方案。
    • 顺便说一句。感谢您的回答 :-)。如果您考虑具有许多元素的对象的集合属性,那么加载通常并不是一个好方法。所以通常你不想急切地加载这样的实体。要使用“在视图中打开会话”模式,您必须手动管理会话。我认为如果您使用的是 jboss 或其他为您自动管理会话的应用程序服务器,则不能使用该模式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多