gpt4 book ai didi

hibernate - JPA - @OneToMany 更新

转载 作者:行者123 更新时间:2023-12-02 23:50:48 25 4
gpt4 key购买 nike

考虑有两个实体,部门和员工,其中一个部门有 N 名员工。

所在部门:

@OneToMany(mappedBy = "department", fetch = FetchType.EAGER)
private Collection<Employee> employees = new ArrayList<Employee>();

在员工中:

@ManyToOne(fetch = FetchType.EAGER)
private Department department;

一切正常,但我想将员工添加到部门而不设置反向关系。例如:

// I will add two employees to a department
department.getEmployees().add(employee1);
department.getEmployees().add(employee2);

// In fact, it is necessary to set the opposite side of the relationship
employee1.setDepartment(department);
employee2.setDepartment(department);

entityManager.merge(department);
//...

所以,我的问题是:是否有某种方式(例如通过某些注释)让 JPA 能够理解它应该将更改传播到关系的另一方,而无需我明确说明?换句话说,我只想这样做:

department.getEmployees().add(employee1);
department.getEmployees().add(employee2);
entityManager.merge(department);

非常感谢!

最佳答案

明确的答案是:不,您的 JPA 提供程序不可能按照您所描述的方式自动处理双向关系。

但是,您可以实现在实体中设置双向关联的逻辑,也许可以遵循以下原则:

class Department {

public void addEmployee(Employee empl) {
if (empl.getDepartment() != null && !this.equals(empl.getDepartment())) {
empl.getDepartment().getEmployees().remove(empl);
}
empl.setDepartment(this); // use the plain setter without logic
this.employees.add(empl);
}
}


class Employee {
// additional setter method with logic
public void doSetDepartment(Department dept) {
if (this.department != null && !this.department.equals(dept)) {
this.department.getEmployees().remove(this);
}
dept.getEmployees().add(this);
this.department = dept;
}
}

但是,在这种情况下,您必须确保在持久化上下文之外处理实体时关联已经初始化,以避免延迟初始化异常。这可能会迫使您切换到所有关联的预先加载,这通常不是一个好的选择。由于双向关联的复杂性,我个人避免在实体中使用双向关联,并且仅在确实有充分理由时才使用它们。

关于hibernate - JPA - @OneToMany 更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8434853/

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