私は、Person
が1つ以上のName
(例えば、変更された女性の場合結婚後の彼女の名前)。モデルは、活発に使用されている単一のName
を区別します。 Person
エンティティ双方向@OneToMany関係とName
エンティティ・クラス内の対応する@ManyToOne関係:JPAで1対多の関係から「デフォルト選択」をモデル化する方法
Person
とName
との一般的な関係は、通常のようにモデル化されます。
「アクティブ名またはプライマリ名」を指定するには、これを単方向の@OneToOne関係としてモデル化できると思っていました。Person
からName
までです。エンティティクラス内のマッピングは次のようになります。
public class Person {
@Id @GeneratedValue(strategy = GenerationType.Identity)
private Long pers_id;
@OneToOne(fetch = FetchType.EAGER, optional = false)
@JoinColumn(name = "name_id", nullable = false)
private Name uniPrimaryName;
:
:
@OneToMany(mappedBy = "owningSidePerson", fetch = FetchType.LAZY,
cascade = CascadeType.ALL)
private List<Name> mappedSideNames;
:
:
}
そしてName
エンティティクラス:
public class Name
@Id @GeneratedValue(strategy = GenerationType.Identity)
private Long name_id;
@ManyToOne(fetch = FetchType.LAZY, optional = false)
@JoinTable (name = "XREF_NAMES_PERSON",
joinColumns = @JoinColumn(name = "name_id", nullable = false),
inverseJoinColumns = @JoinColumn(name = "pers_id", nullable = false))
private Person owningSidePerson;
:
:
}
このモデルの利点は、それは私が単純なプロパティへのアクセスとして主Name
にアクセスできることですPerson
から。それはまた、維持しやすくする必要があります。不利な点は循環参照を持つPerson
エンティティのシリアル化に関係しますが、この問題は単方向関係が存在するかどうかに関係なく存在します。
active
ブール属性をName
エンティティに追加し、それを使用して関係のどのエンティティがアクティブなエンティティであるかを示すことができます。不利な点は、属性の維持があまり簡単ではなく、アクティブなName
を取得するには別のデータベースクエリが必要であるということです。
私はこの設計に時間を費やす前に、誰かがこれを試してみるかどうか尋ねたかったのです。私は、一方向と双方向の関係で同時に存在するエンティティオブジェクトを使用するオブジェクトモデルについて懸念しています。
私はあなたの最初のアイデアを使用しました。主な問題は循環依存です。つまり、名前で参照されている人は削除できません。人が参照しているため名前を削除できません。しかし、正しい順序で実行してフラッシュするか、遅延制約を使用する場合はうまく動作します。 –