JPA中的级联类型

时间:2015-06-03 20:50:35

标签: hibernate jpa eclipselink cascade jpa-2.1

鉴于两个实体DepartmentEmployee形成从DepartmentEmployee的一对多关系。

由于关系非常直观,我忽略了实体类。

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:合并实体状态时,也合并实体   在这个领域举行。

来自EclipseLink Wiki

  

MERGE - 如果合并拥有实体,则合并将级联到   该协会的目标。

来自JPA Wiki Book

  

MERGE - 级联EntityManager.merge()操作。如果merge()   在父节点上调用,然后子节点也将被合并。这个   通常应该用于依赖关系。请注意这一点   只影响合并的级联,关系参考   本身将永远合并。如果您使用,这可能是一个主要问题   瞬态变量限制序列化,您可能需要手动   在这种情况下合并或重置transient关系。一些JPA   提供商提供额外的合并操作。

关于上述测试用例,我并不准确了解何时需要cascade = {CascadeType.MERGE}或有用。在这种情况下cascade = {CascadeType.MERGE}有什么用?

这些测试用例如何在不使用Department的情况下分别合并Employeecascade = {CascadeType.MERGE}

我目前使用的是EclipseLink 2.6.0。

1 个答案:

答案 0 :(得分:2)

您缺少的是JPA的一个基本功能:对托管实体所做的每项更改都自动保存到数据库中。无需致电merge()或其他任何内容。您打开一个事务,获取实体并修改它们,然后提交事务,这就是修改数据库所需的全部内容。

merge()用于将更改从已分离的实体复制到其托管对象。