Java-如何在Hibernate POJO上正确实现.equals?

Java-如何在Hibernate POJO上正确实现.equals?,java,hibernate,entity,equals,pojo,Java,Hibernate,Entity,Equals,Pojo,我无法在POJO中编写正确的equals()函数来与hierbante一起使用。我的主要问题是列表的问题 例如,我有一个实体请求,它有一个人的列表 @ManyToMany(cascade = CascadeType.ALL) @LazyCollection(LazyCollectionOption.FALSE) @JoinTable(name = "JOIN_TABLE_REQUEST_TO_PERSON", joinColumns = @JoinColu

我无法在POJO中编写正确的
equals()
函数来与hierbante一起使用。我的主要问题是列表的问题

例如,我有一个实体
请求
,它有一个
的列表

   @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>();
但是,当我将人员添加到列表中时,这无法正常工作。我必须将此代码更改为:

...
if (!this.proxyList.containsAll(proxyList)) {
    return false;
}
...
应该如何正确地进行?您还有其他为hibernate编写equals的最佳实践吗?

问题就在这里

!this.proxyList.equals(other.proxyList))
它测试的是列表对象而不是单个
代理对象的equals方法

在条件内部迭代它们并检查它们是否相等

  • 您为
    Request
    类生成了
    equals()
    方法,因此Netbeans,就像任何其他IDE实现的方法一样,所有实例级引用都应该指向对象的同一个实例,因此它接受
    proxyList
    引用,并使用正在检查的
    请求的相同属性检查它是否相等

  • List
    (作为一个接口)不实现
    equals
    方法。因此,当您对列表引用调用equals方法时,它基本上会比较两个引用是否指向同一个对象

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

  • 我不明白你的
    equals()
    问题与
    Hibernate
    之间的联系。在我看来,您的问题似乎是合乎逻辑的,与任何持久性框架都没有关系

    我会这样做:

  • Person
    类实现
    hashCode
    equals
    方法。只考虑那些唯一标识每个
    人的字段

  • 请求的
    equals()
    中,除了
    这个.proxyList.containsAll(proxyList)
    之外,我还要检查以确保两个
    proxyList
    实例的大小相同


  • 希望这有帮助。让我知道我是否偏离了基准。

    是否检查
    containsAll()
    是否正确?@RobertNiestroj No.
    containsAll()
    如果
    other
    的“子集”,也将返回
    true
    。millimoose是真的。否。如果此列表包含您传递的所有元素,则返回true。是的,这里似乎没有必要使用Hibernate。我想知道,当我写Hebernate时,在波霍写的代码> >等于/>代码时,是否还有其他的事情要考虑。对hibernate来说,相等值有什么关系吗?不,不应该。。hibernate使用映射为ID的字段来确定对象的标识。它不使用equals方法。然而,一旦hibernate加载了实例,您就进入了纯Java世界,在纯Java世界中,说两个对象相同的唯一正确方法就是hashCode和equals方法。
    !this.proxyList.equals(other.proxyList))