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

时间:2013-06-13 08:16:40

标签: java hibernate entity equals pojo

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

例如,我有一个实体Request,其中包含Person s的列表

   @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;
}
...

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

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

如何正确完成?你有什么其他的最佳实践来为hibernate编写equals吗?

2 个答案:

答案 0 :(得分:0)

问题在这里

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

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

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

答案 1 :(得分:0)

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

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

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

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

    我就是这样做的:

    1. hashCode课程实施equalsPerson方法。仅考虑那些唯一标识每个Person

    2. 的字段
    3. equals()的{​​{1}}中,除了Request之外,我还会检查以确保两个this.proxyList.containsAll(proxyList)实例的大小相同

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