gpt4 book ai didi

spring - JPA 多对多 - 我是否必须从两个集合集中删除\添加?

转载 作者:行者123 更新时间:2023-12-02 05:48:46 27 4
gpt4 key购买 nike

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

我想在他们之间建立@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);

或者有没有办法通过仅删除其中一个来维持此逻辑?

如果我必须保存这两个实体,那么维护起来非常困难,特别是对于那些不了解两个实体的多对多关系的人来说..

最佳答案

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

假设您有一个 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 的调用,例如 persistmerge

关于spring - JPA 多对多 - 我是否必须从两个集合集中删除\添加?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18227039/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com