JPA更新双向关联

Chr*_*Geo 11 java hibernate jpa bidirectional-relation

让我们假设我们有以下实体:

    @Entity
    public class Department {

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

    @Entity
    public class Employee {

        @ManyToOne
        private Department department
    }
Run Code Online (Sandbox Code Playgroud)

在更新中我们需要维护关系的两个方面,这是可以理解的,如下所示:

Employee emp = new Employee();
Department dep = new Department();
emp.setDepartment(dep);
dep.getEmployees().add(emp);
Run Code Online (Sandbox Code Playgroud)

一切都很好,直到现在.问题是我应该如下所示在双方应用合并,并且我避免第二次合并级联?

entityManager.merge(emp);
entityManager.merge(dep);
Run Code Online (Sandbox Code Playgroud)

或者正在合并拥有方?这些合并也应该发生在Transaction或EJB中吗?或者在具有分离实体的简单控制器方法上执行它就足够了?

Deb*_*kia 12

问题是我应该如下所示在双方应用合并,并且我避免第二次合并级联?

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

merge操作级联到由关系引用的实体Department,如果这些关系已经标注了该cascade元素的值cascade=MERGEcascade=ALL注释.

管理实体之间的双向关系将基于(Employee)关系所属方所持有的引用而持久化.开发人员有责任保持内存引用保持在拥有方(Employee),而保持在反方(Department)保持的内容引用在更改时保持一致.因此,通过以下系列语句,关系将与数据库同步merge:

Employee emp = new Employee();
Department dep = new Department();
emp.setDepartment(dep);
dep.getEmployees().add(emp);
...
entityManager.merge(dep);
Run Code Online (Sandbox Code Playgroud)

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

  • @ChrisGeo:这里有两条独立的规则.首先,哪些对象保存到数据库是由关系上的级联属性决定的.其次,每个对象保存到数据库的状态由拥有方对象的状态决定.因此,如果您合并`Department`,并且`employees`属性被标记为级联合并,那么`Employee`s将被合并.如果`Employee`s状态正确,那么正确的数据将被写入数据库. (4认同)