2011-02-08 22 views
41

私はJPA 2.0を使用しており、休止状態です。私は次のようにUserクラスとGroupクラスを持っています:JPA Hibernateの多対多カスケード

public class User implements Serializable { 
    @Id 
    @Column(name="USER_ID") 
    private String userId; 

    @ManyToMany 
    @JoinTable(name = "USER_GROUP", 
       joinColumns = { 
        @JoinColumn(name = "GROUP_ID") 
       }, 
       inverseJoinColumns = { 
        @JoinColumn(name = "USER_ID") 
       } 
    ) 
    private Set<Group> groupList; 

    //get set methods 
} 

public class Group 
{ 
    @Id 
    @Column(name="GROUP_ID") 
    private String groupId; 

    @ManyToMany(mappedBy="groupList") 
    private Set<User> memberList; 
    //get set methods 
} 

そして、私はユーザーとグループを作成し、そのグループにユーザーを割り当てます。

グループを削除すると、グループは削除され、グループに含まれるすべてのユーザーグループの関係は自動的にUSER_GROUP結合テーブルから削除されますが、ユーザー自身はUSER表から削除されません。

上記のコードでは、グループを削除するとGROUPテーブルの行だけが削除され、USER_GROUP結合テーブルの削除されたグループへのエントリがユーザーに残ります。私はこのようなUserクラスにカスケードを置く場合

@ManyToMany(cascade=CascadeType.ALL) 
@JoinTable(name = "USER_GROUP", 
joinColumns = 
{ 
    @JoinColumn(name = "GROUP_ID") 
}, 
inverseJoinColumns = 
{ 
    @JoinColumn(name = "USER_ID") 
}) 
private Set<Group> groupList; 

私はグループを削除すると、ユーザーは、同様に削除されます!

私が欲しいものを達成する方法はありますか?

答えて

33

マッピングされている方法では、Userがリレーションシップの管理側であるため、ジョインテーブルの更新を担当します。

変更GroupUserからJoinTableマッピング、およびそれがmappedBy属性を持っているので、UsergroupList財産を作ります。これにより、グループが関係の管理側に変更され、グループへの永続/更新呼び出しが結合テーブルを管理します。

ただし、ユーザーにグループを追加してユーザーを保存して続行することはできません。代わりに、ユーザーをグループに追加してグループを保存する必要があります変更はありますが、双方向の多対多の関係があれば、関係を密接に管理することができればと思います。

+0

私はあなたが何らかのグループに割り当てられている場合、何も言及していないので、全くカスケードしていないと思いますが、ユーザーを削除するとどうなりますか?結合表のユーザー・グループ関係は削除されますか?グループ自体は削除されますか? – Hery

+2

私の言ったようにすれば、ユーザグループの関係はグループの側面で完全に管理されます。つまり、すべてのグループからユーザーを削除するまで、ユーザーを削除することはできません。これを守るには、グループからユーザーを削除してからグループを保存する必要があります。ユーザーだけを削除しても、ユーザーグループの関係や結合テーブルは削除されません。カスケードがなければ、グループを削除すると関連付けは削除されますが、ユーザーは元の質問では望んだことは削除されません。 – digitaljoel

+0

私は参照してください...管理側としてグループを使用する必要があります...両側を管理グループにする方法はありますか?つまり、ユーザーを削除すると、ユーザーとユーザーグループも削除されますが、グループは削除されます。グループを削除すると、グループとユーザーグループは削除されますが、ユーザーは削除されません。 – Hery

4

すでに説明したように、ユーザー側からカスケードする必要がない場合は、関係のグループ所有者にしてください。

次に、cascade=CascadeType.MERGEを使用して、グループを削除するときにカスケードを削除しないようにしてください。多対多マッピングテーブルあなたにFK制約を追加することができます

5

別の角度から問題を見て。実際には、データの整合性の理由から、常にDBにFKを置く必要があります。この例では、マッピングテーブルに孤立した行を黙って残している間は、少なくともユーザーを削除できませんでした。

FKがある場合は、制約上のdelete cascade referential actionで指定することができ、DBはマッピングテーブルの自動削除を管理しますが、要求したようにエンティティの削除は自動的に管理されません。

関連する問題