2016-08-26 8 views
0

私は、Personが1つ以上のName(例えば、変更された女性の場合結婚後の彼女の名前)。モデルは、活発に使用されている単一のNameを区別します。 Personエンティティ双方向@OneToMany関係とNameエンティティ・クラス内の対応する@ManyToOne関係:JPAで1対多の関係から「デフォルト選択」をモデル化する方法

PersonNameとの一般的な関係は、通常のようにモデル化されます。

「アクティブ名またはプライマリ名」を指定するには、これを単方向の@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を取得するには別のデータベースクエリが必要であるということです。

私はこの設計に時間を費やす前に、誰かがこれを試してみるかどうか尋ねたかったのです。私は、一方向と双方向の関係で同時に存在するエンティティオブジェクトを使用するオブジェクトモデルについて懸念しています。

+1

私はあなたの最初のアイデアを使用しました。主な問題は循環依存です。つまり、名前で参照されている人は削除できません。人が参照しているため名前を削除できません。しかし、正しい順序で実行してフラッシュするか、遅延制約を使用する場合はうまく動作します。 –

答えて

0

私の提案は、名前(mappedSideNames)に人の関係を残し、名前がプライマリかどうかを識別するためにuniPrimaryName属性によってマップされた関係を削除することです。この目的のために名前付きクエリを作成できますが、フラグを設定して引用したときのプライマリ名を区別する方法を作成します。

+0

はい、質問で議論したように、これを達成する方法は、たとえば、名前のエンティティにブール属性を作成してプライマリ名を指定することです。この属性を維持することは簡単ではありません。プライマリ名は頻繁にアクセスされるプロパティでもあります。それを取得するために別のクエリを実行するか、アプリケーションロジックを使用してそれを見つけることが最適な解決策ではないようです – scottb

関連する問題