私の特定の使用パターンを考えると、このアプローチの何が問題なのかを理解しようとしています:
@Entity
public class DomainObject {
@Id // + sequence generator
private Long id;
@Override
public boolean equals(Object o) {
// bunch of other checks omitted for clarity
if (id != null) {
return id.equals(o.getId());
}
return super.equals(o);
}
@Override
public int hashCode() {
if (id != null) {
return id.hashCode();
}
return super.hashCode();
}
この件に関するいくつかの投稿を読みましたが、DB で生成されたシーケンス値を equals/hashCode で使用したくないようです。オブジェクトが永続化されるまで設定されず、異種の一時的な値が必要ないためです。そうしないと、永続層自体が壊れる可能性があります。
しかし、一時的なオブジェクトのデフォルトの Object equals/hashCode (インスタンスの等価性) にフォールバックし、生成された @Id を使用することに何か問題がありますか?
私が考えることができる最悪のことは、一時的なオブジェクトが永続的なオブジェクトと等しくなることは決してないということです.これは私のユースケースでは問題ありませんcontains
.すでに永続的で、すべて ID を持っています。
ただし、永続化レイヤーの奥深くで、非常に微妙で明白ではない方法で何か他の問題があるように感じますが、何が原因かはわかりません。
他のオプションもそれほど魅力的ではないようです。
何もせず、インスタンスの等価性 (デフォルトの Object.equals) で生活する: 私のエンティティのほとんどでうまく機能しますが、切り離されたエンティティ (セッション スコープなど) が混在するコレクションが必要な場合のいくつかのケースの回避策にうんざりしています。現在のトランザクションからの「ライブ」のもの
ビジネス キーの使用: 明確な自然キーがありますが、それらは可変であり、これには上記と同じ問題がいくつかあります (オブジェクトが変更された場合の hashCode の安定性)
UUID を使用する - それが機能することはわかっていますが、Java.util コレクションをサポートするために DB をアーティファクトで汚染するのは間違っていると感じています。
以下も参照してください。