JPA- ManyToMany关系删除操作从辅助表

时间:2016-12-01 22:43:51

标签: java spring postgresql hibernate jpa

我正在使用Spring数据JPA和postgres数据库。 我有两个实体,即组和用户。 我使用Spring的CrudRepository接口创建了存储库。

@Entity
public class Group { 
@ManyToMany(cascade=CascadeType.ALL)
@JoinTable(
        name="group_user_bridge", 
        joinColumns=@JoinColumn(name="joinTbl_groupid", referencedColumnName="groupid"), 
        inverseJoinColumns=@JoinColumn(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注释来软删除组和用户记录。但是我无法为连接表记录实现相同的功能。 连接表中的记录会从我想要阻止的表格中删除。

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

提前致谢。

1 个答案:

答案 0 :(得分:0)

您目前在UserGroup类中使用此注释:

@ManyToMany(cascade=CascadeType.ALL)

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

因此,当您删除Group实例时,删除级联到User实例是有意义的。

考虑将注释更改为:

@ManyToMany(cascade=CascadeType.SAVE_UPDATE)

或任何适合您的申请。

或者,您可以在删除User之前从Group删除Group个实例。