鉴于两个实体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()
在父节点上调用,然后子节点也将被合并。这个 通常应该用于依赖关系。请注意这一点 只影响合并的级联,关系参考 本身将永远合并。如果您使用,这可能是一个主要问题 瞬态变量限制序列化,您可能需要手动 在这种情况下合并或重置transient
关系。一些JPA 提供商提供额外的合并操作。
关于上述测试用例,我并不准确了解何时需要cascade = {CascadeType.MERGE}
或有用。在这种情况下cascade = {CascadeType.MERGE}
有什么用?
这些测试用例如何在不使用Department
的情况下分别合并Employee
和cascade = {CascadeType.MERGE}
?
我目前使用的是EclipseLink 2.6.0。
答案 0 :(得分:2)
您缺少的是JPA的一个基本功能:对托管实体所做的每项更改都自动保存到数据库中。无需致电merge()
或其他任何内容。您打开一个事务,获取实体并修改它们,然后提交事务,这就是修改数据库所需的全部内容。
merge()
用于将更改从已分离的实体复制到其托管对象。