3

我有一个用户实体和一个部门实体

我想在它们之间建立@manyToMany 关系:

许多用户可以有许多部门。

在我的用户实体中:

@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "UserDepartments", joinColumns = { @JoinColumn(name = "user_id", referencedColumnName = "id") }, inverseJoinColumns = { @JoinColumn(name = "department_id", referencedColumnName = "id") })
private Set<Department> departments;

我的部门实体也有一组用户..

我的问题是:

如果我需要实现该方法:

public void removeUserFromDepartment(User user, Department department) {
      //bla bla
}

我需要打电话吗

department.getUserCollection.remove(user);

user.getDepartmentCollection.remove(department);

或者有没有办法通过只删除其中一个来保持这种逻辑?

如果我必须同时保存两者,尤其是对于不了解这两个实体的多对多关系的人来说,这很难维护。

4

1 回答 1

2

当JPA 中存在OneToManyorManyToMany关系时,客户端代码负责管理该关系。这意味着您必须从关系的双方显式删除对象。

因此,假设您有一个User实例并且需要删除一个部门。

User user = dao.findUser(1L); //Find a user, psuedo code
Department dept = user.getDepartments().get(0);
dept.getUsers().remove(user);
user.getDepartments().remove(user);
dao.update(user); //once again psuedo code

要使用上面的代码,您应该在用户实体中的关系中添加一个级联类型:

@ManyToMany(fetch = FetchType.LAZY, cascade=CascadeType.ALL)
@JoinTable(name = "UserDepartments", joinColumns = { @JoinColumn(name = "user_id", referencedColumnName = "id") }, inverseJoinColumns = { @JoinColumn(name = "department_id", referencedColumnName = "id") })
private Set<Department> departments;

这将导致User实体上的保存被级联到Departments实体。只是提醒一下保存是伪代码,它会归结为对EntityManager诸如persist或的调用merge

于 2013-08-14T08:52:15.527 回答