1

私のコードに2つのアドレスを持つ人を持つように注釈を付ける方法:

@Entity
public Person {

    // ... other attributes for a person

    @OneToOne
    public Address homeAddress;

    @OneToOne
    public Address workAddress;
}

@Entity
public Address {

    // ... other attributes for an address

    @OneToOne
    public Person person;
}

OneToOne を使用できますか? この注釈にオプションを使用する必要がありますか?

4

2 に答える 2

1

残念ながら、これは では達成できません@OneToOne。理由:

持続性プロバイダーはPerson、テーブルの 2 つのエントリに対して 1 つの ID を持ちAddressます。Addressこれは、与えられた関係がどの関係に属しているかを決定するのに十分ではありません。

type最も簡単な解決策は、フィールド (列挙型) をエンティティに追加しAddress、アドレスを でマップすること@OneToMany/@ManyToOneです。

ホームアドレスを取得するには、アドレスを反復処理してタイプを確認する必要があります。

または、から派生するHomeAddressやのような追加の型を作成することもできます。その後、リレーションを維持できますが、 2 つのタイプが追加されることになります。WorkAddressAddress@OneToOne

IMO よりクリーンなエンティティ関係マッピングは、いくつかの問題を招いているため、これを行う十分な理由ではありません。たとえば、 aHomeAddressが になることはありませんWorkAddress

編集: 両方のAddressID がテーブルに格納されている場合は、リレーションPersonを使用できるはずです。@OneToOneアタッチされた Address エンティティを確実に削除し、孤立した Address エンティティを削除するには、カスケードと孤立した削除を使用できます。

@OneToOne(cascade=CascadeType.ALL, orphanRemoval=true)

これは、DB に孤立したレコードが存在しないことを確認しているように見えるかもしれませんがAddress、完全に正しいわけではありません。孤立した削除は、エンティティがアタッチされている間にトランザクション内で参照されたエンティティを削除する場合にのみ機能します。さらに、一括更新では機能しません。クエリは喜んでDELETE FROM Person WHERE ...人物を削除し、接続されたアドレスには触れません。

于 2013-05-03T11:10:11.157 に答える