【发布时间】:2015-06-03 20:50:34
【问题描述】:
给定两个实体 Department 和 Employee 形成从 Department 到 Employee 的一对多关系。
由于关系非常直观,我省略了实体类。
在Department:
@OneToMany(mappedBy = "department", fetch = FetchType.LAZY)
private List<Employee> employeeList = new ArrayList<Employee>(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<Employee> employeeList = department.getEmployeeList();
for(Employee e:employeeList) {
if(e.getEmployeeId().equals(27L)) {
e.setEmployeeName("xxx");
}
}
// No further EntityManager operation(s) here.
为Employee 实例设置的新值直接合并到关联的底层数据库中。
来自OpenJPA:
CascadeType.MERGE: 合并实体状态时,也合并实体 在这个领域举行。
MERGE – 如果拥有实体被合并,则合并级联到 关联的目标。
MERGE- 级联EntityManager.merge()操作。如果merge()在父对象上调用,则子对象也将被合并。这个 通常应该用于依赖关系。请注意,这 只影响merge的级联,关系引用 本身将始终被合并。如果您使用,这可能是一个主要问题 瞬态变量来限制序列化,您可能需要手动 在这种情况下合并或重置transient关系。一些 JPA 提供者提供额外的合并操作。
关于上面的测试用例,我不知道什么时候需要cascade = {CascadeType.MERGE} 或者什么时候有用。这种情况下cascade = {CascadeType.MERGE}有什么用?
这些测试用例如何在不使用cascade = {CascadeType.MERGE}的情况下分别合并Department和Employee?
我目前使用的是 EclipseLink 2.6.0。
【问题讨论】:
标签: hibernate jpa eclipselink cascade jpa-2.1