2011-09-22 24 views
4

ロール階層を実装したいのですが、JPA注釈を新しく使っています。JPA同じエンティティのオブジェクト間の多対多関係の注釈

  • 役割を持つことができます。私は、次の関係を定義することができるようにしたい今

    @Entity 
    @Table(name="role") 
    public class Role extends AbstractPersistable<Long> { 
        private static final long serialVersionUID = 8127092070228048914L; 
        private String name; 
    

    私は名前を持つ役割のエンティティと(AbstractPersistable経由暗黙の)IDを持っています役割は、多くの役割

方法WOUの子することができ、多くの子の役割

  • 私はHibernateアノテーションでそれを行いますか?ロールエンティティ内でこれを定義できますか

    @ManyToMany(cascade = CascadeType.MERGE) 
    @JoinTable(name = "role_hierarchy", 
          joinColumns = { @JoinColumn(name = "role_id")}, 
          inverseJoinColumns={@JoinColumn(name="child_role_id")}) 
    private List<Role> roles; 
    
    @ManyToMany(cascade = CascadeType.MERGE) 
    @JoinTable(name = "role_hierarchy", 
          joinColumns = { @JoinColumn(name = "child_role_id")}, 
          inverseJoinColumns={@JoinColumn(name="role_id")}) 
    private List<Role> children; 
    

    私は適切なトラックにいますか?私は何が欠けていますか?

    ありがとうございました!


    EDIT: - 取り外し、それが解決されたように -


    EDIT 2:

    を私は自分のアプリケーション・スタックにいくつかのバグを持っているように見えます。モデル定義レベルでは、role_hierarchyはうまく動いているので、EDIT 1は気にしないでください。

    しかし、両方の方法が動作しているようです(m:nテーブルエントリを作成しています。エンティティの子供):@ManyToMany注釈

  • で無mappedByプロパティで両側のための結合列を定義するだけでなく、所有側と逆側を定義する

    • 私の提案。

    どういう違いがありますか?それは問題ですか?

  • 答えて

    14

    双方向関係は所有側と逆側からなります。あなたはmappedBy属性に対応する所有する側を指す逆側で

    @ManyToMany(cascade = CascadeType.MERGE) 
    @JoinTable(name = "role_hierarchy", 
          joinColumns = { @JoinColumn(name = "role_id")}, 
          inverseJoinColumns={@JoinColumn(name="child_role_id")}) 
    private List<Role> roles; 
    

    :所有側で

    あなたは関係の物理的性質宣言について

    @ManyToMany(cascade = CascadeType.MERGE, mappedBy = "roles") 
    private List<Role> children;  
    

    多くを対多くの関係は、どちら側が所有側であるかは関係ありません(所有側の変更のみがデータベースに伝播されるため、両側を一貫して変更する限り)。

    も参照してください:あなたが道にも鉱山が(EDIT2を参照)として働くように

    +0

    が見えます。違いは何ですか?...? – Pete

    +0

    @ Pete: 'mappedBy'を指定しないと、sinlge双方向の代わりに2つの一方向の関係を作成します。 2つの関係が同じ結合表を使用する場合、どのように動作するかはわかりません。 – axtavt