【问题标题】:Cascade types in JPAJPA 中的级联类型
【发布时间】:2015-06-03 20:50:34
【问题描述】:

给定两个实体 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() 在父对象上调用,则子对象也将被合并。这个 通常应该用于依赖关系。请注意,这 只影响merge的级联,关系引用 本身将始终被合并。如果您使用,这可能是一个主要问题 瞬态变量来限制序列化,您可能需要手动 在这种情况下合并或重置transient 关系。一些 JPA 提供者提供额外的合并操作。

关于上面的测试用例,我不知道什么时候需要cascade = {CascadeType.MERGE} 或者什么时候有用。这种情况下cascade = {CascadeType.MERGE}有什么用?

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

我目前使用的是 EclipseLink 2.6.0。

【问题讨论】:

    标签: hibernate jpa eclipselink cascade jpa-2.1


    【解决方案1】:

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

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

    【讨论】:

    • 我看到cascade = {CascadeType.MERGE} 的缺席并没有什么不同。究竟什么时候需要?
    • 实际合并一个分离的实体时会有所不同。如果您有一个包含分离员工的分离部门,并且您合并该部门,则员工也将被合并或不合并,具体取决于级联的存在。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-15
    • 1970-01-01
    • 1970-01-01
    • 2021-08-19
    • 1970-01-01
    相关资源
    最近更新 更多