0

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

例如,我有一个实体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.3equals()并为此列表生成代码:

...
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的最佳实践吗?

4

2 回答 2

0
  1. 您为该类生成了一个equals()方法Request,因此 Netbeans,就像任何其他 IDE 实现了该方法一样,所有实例级引用都应指向对象的同一个实例,因此它获取proxyList引用并使用被检查的相同属性对其Request进行检查为了平等。

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

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

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

我会这样做:

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

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

希望这可以帮助。如果我不在基地,请告诉我。

于 2013-06-13T08:32:06.103 回答
0

问题就在这里

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

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

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

于 2013-06-13T08:22:58.910 回答