我目前正在使用hibernate
和java
。我有一个Group
班和一个User
班。它们具有多对多的关系,因为用户可以在多个组中,并且组可以具有多个用户。您可以在此处查看我们ERD
的一部分:ERD。
我定义关系的Group
类的一部分:
@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinTable(name = "Group_Users", catalog = "jelo3", joinColumns = {
@JoinColumn(name = "Group_id", nullable = false, updatable = false) },
inverseJoinColumns = { @JoinColumn(name = "User_id", nullable = false, updatable = false) })
public Set<User> getAllGroupMembers() {
return this.allGroupMembers;
}
我删除该组的部分:
@Override
public void delete(int id) {
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
Group g = (Group) session.get(Group.class, id);
session.getTransaction().commit();
if (g != null) {
session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
session.delete(g);
session.getTransaction().commit();
}
}
观察:问题在于,当我删除某个群组时,该群组中的所有用户也会被删除。
实际要求:删除组时,应删除链接表中的所有记录,但不应删除用户。
答案 0 :(得分:1)
您从cascade = CascadeType.ALL
到Group
有User
,这意味着在该组上调用的删除操作将级联到该组中的所有用户。使用双向映射时,您需要维护关系的两个方面。
当您从数据库获取Group
时,请浏览其用户并从其组列表中删除该组。之后,从组中删除用户。像这样的东西
if (g != null) {
session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
for (User u : g.getUsers()) {
u.getGroups().remove(g);
}
g.getUsers().clear();
session.delete(g);
session.getTransaction().commit();
}
答案 1 :(得分:0)
DELETE ON CASCADE
以删除子节点,同时删除要定义的hibernate映射中的Parent或CascadeType
枚举