假设我们具有以下实体:
@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内部进行?还是在具有分离实体的简单控制器方法上完成它?
问题是,我是否应按以下所述在双方上进行合并,并且避免使用级联进行第二次合并?
您可以使用级联注释元素将操作的效果传播到关联的实体。级联功能最常用于父子关系中。
如果已使用元素值或注释对这些关系进行了注释,则该merge操作将级联到Department该关系所引用的实体。cascade``cascade=MERGE``cascade=ALL
merge
Department
cascade``cascade=MERGE``cascade=ALL
受管实体之间的双向关系将根据(Employee)该关系拥有方所拥有的引用来保留。当它们更改时,开发人员有责任使在内存中拥有的引用和在内存中(Employee)相反的引用(Department)彼此保持一致。因此,通过以下一系列语句,该关系将通过单个语句同步到数据库merge:
(Employee)
(Department)
Employee emp = new Employee(); Department dep = new Department(); emp.setDepartment(dep); dep.getEmployees().add(emp); ... entityManager.merge(dep);
这些更改将在事务提交时传播到数据库。通过使用EntityManager#flush方法,在事务处于活动状态时,实体的内存状态也可以在其他时间同步到数据库。