2016-12-01 13 views
0

私はSpringのJPAとpostgresデータベースを使用しています。 私は2つのエンティティ、つまりグループとユーザーを持っています。 私はSpringのCrudRepositoryインタフェースを使ってリポジトリを作成しました。JPA- ManyToManyリレーションセカンダリテーブルからすべてのエンティティを削除します

@Entity 
public class Group { 
@ManyToMany(cascade=CascadeType.ALL) 
@JoinTable(
     name="group_user_bridge", 
     [email protected](name="joinTbl_groupid", referencedColumnName="groupid"), 
     [email protected](name="joinTbl_agentid", referencedColumnName="userid") 
     ) 
private Set<User> users; 
.... 
} 

クラスのユーザー

@Entity 
public class User { 

@ManyToMany(mappedBy="users",cascade=CascadeType.ALL,fetch=FetchType.EAGER) 
private List<Group> groups; 
..... 
} 

Repository.save:正常に動作します。 IはgroupRepository.delete(groupEntity)を使用してグループを削除すると

@Test 
    public void addGroup(){ 
     Group hg = new Group(); 

     User h1 = new User(); 
     User h2 = new User(); 
     some setters for user entity object 

     hg.setName("testGroup"); 
     ... some setters for groups 

     HashSet<User> groupMembers = new HashSet<User>(); 
     groupMembers.add(h2); 
     groupMembers.add(h1); 
     hg.setGroupMembers(groupMembers); 

     hg = groupRepository.save(hg); 

質問

は、グループ、結合テーブルからグループ及びユーザの関連付けを削除します。
でも、ユーザテーブルからユーザを削除します。実際にはユーザーレコードは削除されてはならない

ここでユーザーを削除しないようにするにはどうすればよいですか?

私はグループとユーザーレコードをソフト削除するために@SQLDeleteアノテーションを使用しています。しかし、私は結合テーブルレコードのために同じことを達成することができません。 結合テーブルのレコードは、私が避けたいテーブルからハード削除されます。

どのようにして結合テーブルレコードのハード削除を防止できますか?

ありがとうございます。 save, delete, update, evict, lock, replicate, merge, persist

だから、それはあなたが削除することを意味します:Hibernate docsこれは、次の操作のカスケードを引き起こすであろうことを示している

@ManyToMany(cascade=CascadeType.ALL) 

答えて

0

現在UserGroupクラスでこの注釈を持っていますGroupインスタンス、削除は、Userインスタンスにカスケードします。

@ManyToMany(cascade=CascadeType.SAVE_UPDATE) 

または何あなたのアプリケーションに適しています。

は次のように注釈を変更することを検討してください。

Groupを削除する前に、UserインスタンスをGroupから削除することもできます(オプション)。

+0

返信いただきありがとうございます。 SAVE_UPDATEをチェックしてチェックします。ユーザーがグループ全体に移動できるシナリオを検討していました。グループを一度削除すると、ユーザーは元のままにしておく必要があります。 – Yogesh