2016-12-01 183 views
0

我正在使用Spring数据JPA和postgres数据库。 我有两个实体,即组和用户。 我已经使用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:正常工作。

@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); 

问题

当我删除使用groupRepository.delete(groupEntity)组,将删除组,组和用户从连接表的关联。
但它也从用户表中删除用户。实际上用户记录不应该被删除

如何防止用户在这里删除?

我使用@SQLDelete注释软删除组和用户记录。但我无法为连接表记录实现相同的功能。 连接表中的记录从我想要阻止的表中硬删除。

如何防止连接表记录的硬删除?

在此先感谢。

回答

0

您目前有这个注释在UserGroup类:

@ManyToMany(cascade=CascadeType.ALL) 

Hibernate docs表明,这将导致以下操作的级联:save, delete, update, evict, lock, replicate, merge, persist

因此,它是当你删除感Group实例,删除级联到User实例。

考虑更改注释是这样的:

@ManyToMany(cascade=CascadeType.SAVE_UPDATE) 

或者任何适用于您的应用程序。

(可选)在删除Group之前,您可以从Group中删除User实例。

+0

感谢您的回复。将检查SAVE_UPDATE并检查。我正在考虑一个场景,用户可以在整个组中移动,因此,如果一旦组被删除,用户应保持完好。 – Yogesh