Java Hibernate:调用List.contains时不调用contains
我所拥有的: 我在人和地址实体之间有一对多的关系Java Hibernate:调用List.contains时不调用contains,java,hibernate,hibernate-mapping,Java,Hibernate,Hibernate Mapping,我所拥有的: 我在人和地址实体之间有一对多的关系 @Entity class Person { ... @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true) @JoinColumn(name = "person_id") private List<Address> addresses; ... } 真是个问题 Hibernate不调用地址实体的equ
@Entity
class Person {
...
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true)
@JoinColumn(name = "person_id")
private List<Address> addresses;
...
}
真是个问题
Hibernate不调用地址实体的equals方法!似乎它只是比较实体的ID
问题:
force List.contains如何使用重写的equals方法
编辑
答复:
尽管我知道原因,但我还是不能理解。因此,原因是:
地址集合具有延迟获取类型,这意味着Hibernate没有时间加载它
但还有一个问题:
很容易理解为什么它不调用equals方法,但是为什么惰性集合的contains方法总是返回true呢?重写Address类的equals方法,然后使用普通的ArrayListcontains,因为它使用equals来计算两个对象是否相同。您实现了Address类的equals和hashCode方法吗??如果是,请在此处发布代码。Hibernate与方法call list.contains无关。如果正确实现了equals,它将返回true.only equals方法。我需要hashCode吗?请参阅尝试调试代码并在equals方法中设置断点。如果你能发布你的equals方法,它将帮助我们找出背后的原因。
if (address.getId() != 0 && !person.getAddresses().contains(address)) {
//this address has already been persisted but one (or more) of it fields have been modified
//than it has been modified
}
@Override
public boolean equals(Object o) {
if (o == this) return true;
if (!(o instanceof VacancyComment))
return false;
VacancyComment vc = (VacancyComment) o;
if (!(vc.getId() == this.getId()))
return false;
if (!vc.getAuthor().equals(this.getAuthor()))
return false;
if (!vc.getCreated().equals(this.getCreated()))
return false;
if (!vc.getText().equals(this.getText()))
return false;
return true;
}