我正在使用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注释来软删除组和用户记录。但是我无法为连接表记录实现相同的功能。 连接表中的记录会从我想要阻止的表格中删除。
我们如何防止连接表记录的硬删除?
提前致谢。
答案 0 :(得分:0)
您目前在User
和Group
类中使用此注释:
@ManyToMany(cascade=CascadeType.ALL)
Hibernate docs表示这会导致以下操作的级联:save, delete, update, evict, lock, replicate, merge, persist
因此,当您删除Group
实例时,删除级联到User
实例是有意义的。
考虑将注释更改为:
@ManyToMany(cascade=CascadeType.SAVE_UPDATE)
或任何适合您的申请。
或者,您可以在删除User
之前从Group
删除Group
个实例。