我在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吗?
答案 0 :(得分:0)
问题在这里
!this.proxyList.equals(other.proxyList))
它测试List对象的equals方法而不是单个proxy Object
。
在条件内迭代它们并检查天气是否相等。
答案 1 :(得分:0)
您为equals()
类生成了Request
方法,因此Netbeans就像任何其他IDE实现该方法一样,所有实例级引用都应该指向对象的同一个实例因此它需要proxyList
引用并使用被检查的Request
的相同属性进行检查。
List
(作为接口)未实现equals
方法。因此,当您在列表引用上调用equals方法时,它基本上会比较两个引用是否指向同一个对象。
如果请求中包含的Request
个对象相同,那么您的逻辑规定应该认为两个Person
个对象是相等的。然后,您应该如何实施Request
equals()
方法。你不能指望IDE为你做到这一点。
我不理解您的equals()
问题与Hibernate
之间的关联。对我来说,你的问题似乎是合乎逻辑的,与任何持久性框架无关。
我就是这样做的:
为hashCode
课程实施equals
和Person
方法。仅考虑那些唯一标识每个Person
在equals()
的{{1}}中,除了Request
之外,我还会检查以确保两个this.proxyList.containsAll(proxyList)
实例的大小相同
希望这会有所帮助。如果我不在基地,请告诉我。