给定两个实体 Department 和 Employee 形成从 Department 到 Employee 的一对多关系 .
由于这种关系非常直观,我忽略了实体类 .
在 Department :
@OneToMany(mappedBy = "department", fetch = FetchType.LAZY)
private List employeeList = new ArrayList(0);
在 Employee :
@ManyToOne(fetch = FetchType.LAZY)
private Department department;
请注意,我没有提到 cascade = {CascadeType.MERGE} 虽然以下关系在两侧合并(拥有和反面) .
Employee employee = entityManager.find(Employee.class, 18L);
employee.setEmployeeName("zz");
Department department = employee.getDepartment();
employee.setDepartment(department);
department.setDepartmentName("e");
department.setLocation("e");
entityManager.merge(employee);
合并 Employee 时, Department 也合并 .
相反,在以下情况中,
Department department = entityManager.find(Department.class, 1L);
List employeeList = department.getEmployeeList();
for(Employee e:employeeList) {
if(e.getEmployeeId().equals(27L)) {
e.setEmployeeName("xxx");
}
}
// No further EntityManager operation(s) here.
设置为 Employee 实例的新值将直接合并到关联的基础数据库中 .
CascadeType.MERGE:合并实体状态时,还合并此字段中保存的实体 .
MERGE - 如果合并拥有实体,则合并将级联到关联的目标 .
MERGE - 级联EntityManager.merge()操作 . 如果在父项上调用merge(),则子项也将合并 . 这通常应该用于依赖关系 . 请注意,这只会影响合并的级联,关系引用本身将始终合并 . 如果使用瞬态变量来限制序列化,则可能是一个主要问题,在这种情况下,您可能需要手动合并或重置瞬态关系 . 一些JPA提供程序提供其他合并操作 .
关于上面的测试用例,我不能准确理解何时需要或者有用 cascade = {CascadeType.MERGE} . 在这种情况下 cascade = {CascadeType.MERGE} 有什么用?
这些测试用例如何在不使用 cascade = {CascadeType.MERGE} 的情况下分别合并 Department 和 Employee ?
我目前在EclipseLink 2.6.0上 .