【问题标题】:Java - How to correctly implement .equals on Hibernate POJOs? [duplicate]Java - 如何在 Hibernate POJO 上正确实现 .equals? [复制]
【发布时间】:2013-06-09 13:25:37
【问题描述】:

我在 POJO 中编写正确的 equals() 函数以与 hierbante 一起使用时遇到问题。我的主要问题是 List 的。

例如,我有一个实体Request,它有一个Persons 列表

   @ManyToMany(cascade = CascadeType.ALL)
   @LazyCollection(LazyCollectionOption.FALSE)
   @JoinTable(name = "JOIN_TABLE_REQUEST_TO_PERSON", joinColumns =
           @JoinColumn(name = "REQUEST_ID"), inverseJoinColumns =
           @JoinColumn(name = "PERSON_ID"))
   private List<Person> proxyList = new ArrayList<Person>();

现在我使用 Netbeans 7.3 生成的 equals() 并为此列表生成代码:

...
if (this.proxyList != other.proxyList && (this.proxyList == null || !this.proxyList.equals(other.proxyList))) {
         return false;
}
...

但是,当我将 Persons 添加到列表时,这无法正常工作。我不得不将此代码更改为:

...
if (!this.proxyList.containsAll(proxyList)) {
    return false;
}
...

应该如何正确完成?您还有其他关于为 hibernate 编写 equals 的最佳实践吗?

【问题讨论】:

    标签: java hibernate entity equals pojo


    【解决方案1】:

    问题来了

    !this.proxyList.equals(other.proxyList))
    

    它测试List对象的equals方法不是单独的proxy Object

    在条件中迭代它们并检查它们是否相等。

    【讨论】:

    • 这个检查是 containsAll() 好吗?
    • @RobertNiestroj No. containsAll() 如果otherthis 的“子集”,也会返回true
    • millimoose 是真的。否。如果此列表包含您传递的所有元素,则返回 true。
    【解决方案2】:
      1234563 proxyList 引用并使用 Request 的相同属性检查它是否相等。
    1. List(作为接口)没有实现equals 方法。因此,当您在列表引用上调用 equals 方法时,它基本上会比较两个引用是否指向同一个对象。

    2. 如果请求中包含的 Person 对象相同,则您的逻辑规定应将两个 Request 对象视为相等。那么这就是你应该如何实现你的Requestequals()方法。您不能指望 IDE 为您做到这一点。

    我不明白你的equals() 问题和Hibernate 之间的联系。对我来说,您的问题似乎是合乎逻辑的,与任何持久性框架无关。

    我会这样做:

    1. Person 类实现hashCodeequals 方法。只考虑那些唯一标识每个Person的字段

    2. Requestequals()中,除了this.proxyList.containsAll(proxyList)之外,我还会检查确保两个proxyList实例的大小相同。

    希望这会有所帮助。如果我不在基地,请告诉我。

    【讨论】:

    • 是的,Hibernate 在这里似乎没有必要。我想知道当我在 POJO 中写 equals 时是否还有其他需要考虑的事情,这些事情是由 hibernate 使用的。 equals 对休眠有任何影响吗?
    • 不,它不应该.. hibernate 使用映射为 ID 的字段来确定对象的身份。它不使用equals方法。然而,一旦实例被 hibernate 加载,你就进入了纯 Java 世界,其中说两个对象相同的唯一正确方法是 hashCode 和 equals 方法。
    猜你喜欢
    • 1970-01-01
    • 2011-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-03
    • 1970-01-01
    • 1970-01-01
    • 2019-06-02
    相关资源
    最近更新 更多