残念ながら、これは では達成できません@OneToOne
。理由:
持続性プロバイダーはPerson
、テーブルの 2 つのエントリに対して 1 つの ID を持ちAddress
ます。Address
これは、与えられた関係がどの関係に属しているかを決定するのに十分ではありません。
type
最も簡単な解決策は、フィールド (列挙型) をエンティティに追加しAddress
、アドレスを でマップすること@OneToMany/@ManyToOne
です。
ホームアドレスを取得するには、アドレスを反復処理してタイプを確認する必要があります。
または、から派生するHomeAddress
やのような追加の型を作成することもできます。その後、リレーションを維持できますが、 2 つのタイプが追加されることになります。WorkAddress
Address
@OneToOne
IMO よりクリーンなエンティティ関係マッピングは、いくつかの問題を招いているため、これを行う十分な理由ではありません。たとえば、 aHomeAddress
が になることはありませんWorkAddress
。
編集: 両方のAddress
ID がテーブルに格納されている場合は、リレーションPerson
を使用できるはずです。@OneToOne
アタッチされた Address エンティティを確実に削除し、孤立した Address エンティティを削除するには、カスケードと孤立した削除を使用できます。
@OneToOne(cascade=CascadeType.ALL, orphanRemoval=true)
これは、DB に孤立したレコードが存在しないことを確認しているように見えるかもしれませんがAddress
、完全に正しいわけではありません。孤立した削除は、エンティティがアタッチされている間にトランザクション内で参照されたエンティティを削除する場合にのみ機能します。さらに、一括更新では機能しません。クエリは喜んでDELETE FROM Person WHERE ...
人物を削除し、接続されたアドレスには触れません。