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