一尘不染

JPA更新双向关联

hibernate

假设我们具有以下实体:

    @Entity
    public class Department {

        @OneToMany(mappedBy="department")
        private List<Employee> employees;
    }

    @Entity
    public class Employee {

        @ManyToOne
        private Department department
    }

在更新中可以理解,我们需要保持双方的关系如下:

Employee emp = new Employee();
Department dep = new Department();
emp.setDepartment(dep);
dep.getEmployees().add(emp);

到目前为止一切都很好。问题是,我是否应按以下所述在双方上进行合并,并且避免使用级联进行第二次合并?

entityManager.merge(emp);
entityManager.merge(dep);

还是合并拥有者足够?这些合并是否还应该在Transaction或EJB内部进行?还是在具有分离实体的简单控制器方法上完成它?


阅读 293

收藏
2020-06-20

共1个答案

一尘不染

问题是,我是否应按以下所述在双方上进行合并,并且避免使用级联进行第二次合并?

您可以使用级联注释元素将操作的效果传播到关联的实体。级联功能最常用于父子关系中。

如果已使用元素值或注释对这些关系进行了注释,则该merge操作将级联到Department该关系所引用的实体。cascade``cascade=MERGE``cascade=ALL

受管实体之间的双向关系将根据(Employee)该关系拥有方所拥有的引用来保留。当它们更改时,开发人员有责任使在内存中拥有的引用和在内存中(Employee)相反的引用(Department)彼此保持一致。因此,通过以下一系列语句,该关系将通过单个语句同步到数据库merge

Employee emp = new Employee();
Department dep = new Department();
emp.setDepartment(dep);
dep.getEmployees().add(emp);
...
entityManager.merge(dep);

这些更改将在事务提交时传播到数据库。通过使用EntityManager#flush方法,在事务处于活动状态时,实体的内存状态也可以在其他时间同步到数据库。

2020-06-20