假设我们有以下实体:
@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);
还是把所有方面合并得足够?这些合并还会发生在事务或EJB内吗?或者用一个简单的控制器方法用独立的实体做足够的?
解决方法
The question is should I apply merge on both sides as follows,and an I avoid the second merge with a cascade?
您可以使用级联注释元素将操作的效果传播到关联实体.级联功能最常用于父子关系.
如果这些关系已经使用级联元素值cascade = MERGE或cascade = ALL注释注释,则将合并操作级联到由Department关系引用的实体.
管理实体之间的双向关系将根据关系所有者(员工)所持有的参考资料而持续存在.开发人员有责任保留内部存在的参考资料(Employee),而持有的内部参与者(Department)在变更时相互保持一致.所以,使用下面的一系列语句,这个关系将通过一个合并与数据库同步:
Employee emp = new Employee(); Department dep = new Department(); emp.setDepartment(dep); dep.getEmployees().add(emp); ... entityManager.merge(dep);
这些更改将在事务提交时传播到数据库.当事务通过使用EntityManager#flush方法处于活动状态时,实体的内存状态也可以在其他时间同步到数据库.