私が持っているもの:
Person エンティティと Address エンティティの間に 1 対多の関係があります。
@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 がそれをロードする時間がなかったことを意味します。
しかし、まだ 1 つの質問があります。
equals() メソッドを呼び出さない理由を理解するのは簡単ですが、レイジー コレクションの contains() メソッドが常に true を返すのはなぜですか??