gpt4 book ai didi

java - Hibernate:调用 List.contains 时不会调用 contains

转载 作者:行者123 更新时间:2023-12-01 04:12:43 25 4
gpt4 key购买 nike

我拥有的:

我在 Person 和 Adress 实体之间有一对多关系。

@Entity
class Person {
...
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, orphanRemoval = true)
@JoinColumn(name = "person_id")
private List<Address> addresses;
...
}

我需要什么:

我需要检查特定地址是否已被修改。所以,我愿意

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
}

问题是什么

Hibernate 不调用 Address 实体的 equals() 方法!看起来它只是比较实体的 id。

问题:

如何强制 List.contains 使用重写的 equals() 方法?

编辑

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

答案:

尽管我知道原因,但我还是无法理解。所以原因是:地址收集具有 LAZY 获取类型,这意味着 Hibernate 没有时间加载它。

但是还有一个问题:

很容易弄清楚为什么它不调用 equals() 方法,但是为什么惰性集合的 contains() 方法总是返回 true?

最佳答案

重写 Address 类的 equals() 方法,然后使用普通的 ArrayList#contains() 怎么样? equals() 评估两个对象是否相同。

关于java - Hibernate:调用 List.contains 时不会调用 contains,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19766611/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com