【问题标题】:Use of Cascade in ManyToOne relation在多对一关系中使用级联
【发布时间】:2013-05-20 15:32:05
【问题描述】:

在 Hibernate Entities 中的 ManyToOne 关联的两侧使用 Cascade 是否合适?为了使我的问题更具体,让我们假设某人有以下相关实体:

   public class Department
    {
    public long id;

    @OneToMany(mappedBy = "department", cascade=cascadeType.REMOVE)
    private Set<Employee> employees;
    }

    public class Employee{

    @GeneratedValue(strategy=GeneratedValue.identity)
    public longempid;

    @ManyToOne
    public Department department;
    }

在上述关系中,Department 有多个Employees,因此在删除Department 时强制删除Employees 是合理的。我说的对吗?

但是,关系的所有者是Employee。因此我的问题是,关于将cascadeType.PERSIST 放在哪里的正确选择是什么。我可以根据特殊需要选择两侧中的一个,或者我可以将它放在两侧吗?如果我把它放在Department 一侧,考虑到Employee 是关系的所有者,以下代码是否也保存了Employees

Employee e1 = new Employee();
Employee e2 = new Employee();
Department d = new Department();
d.getEmployees.add(e1);
d.getEmployees.add(e2);
em.persist(d);

如果我将cascadeType.PERSIST 放在Employee 一侧,我几乎可以肯定相反的效果。(保存Employee 也会保存Department)。

【问题讨论】:

    标签: hibernate jpa entity cascade


    【解决方案1】:

    首先,在您发布的代码中,员工不是协会的所有者。如果关联是双向的,并且 OneToMany 关联因此定义为 mappedBy 属性,则它会:

    @OneToMany(mappedBy = "department", cascade = cascadeType.REMOVE)
    private Set<Employee> employees;
    

    (请注意,我还将该字段设为私有。永远不应使用公共字段)。

    关于罢免部门:在我公司,当一个部门被罢免时,它的所有员工都不会被自动解雇。他们可以被分配到另一个部门,甚至可以留在公司而不影响到一个部门,但它们不会被删除。我了解您的应用程序不一定模拟现实世界,但是不,删除部门时强制删除员工不一定是合理的。

    现在,假设映射如上,是的,您可以完美地将 PERSIST 级联添加到 OneToMany 关联。级联和所有权是正交的概念。如果您希望persist() 操作从部门级联到其员工(即,如果您想在创建部门时创建员工),则添加此级联。为了保存关联,由于所有者方是 Employee,因此必须正确初始化 employee.department 字段。

    【讨论】:

    • 您对 mappedBy 的看法是正确的,因此我更新了问题。根据您的回答,我推断您的建议是,cascadeType.PERSIST 可以在双方使用并且有效。我说的对吗?
    • 我当然想尝试一下,但是有些东西阻碍了我在 PC 上使用 Hibernate。查看我的相关答案以了解原因:stackoverflow.com/questions/16638930/…
    • 如果级联 PERSIST 在部门(而非所有者)一侧,则通过执行 department.getEmployees().add(new Employee()); session.persist(department),它保存了员工,但在外键 Department_ID 列中为空。显然它需要第一个employee.setDepartment(department);
    • 是的,这就是我所说的“为了保存关联,由于所有者方是 Employee,因此必须正确初始化 employee.department 字段”
    猜你喜欢
    • 2016-05-03
    • 2011-03-13
    • 1970-01-01
    • 1970-01-01
    • 2018-06-28
    • 1970-01-01
    • 2020-07-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多