3

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

   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;
    }

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

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

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)。

4

1 回答 1

4

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

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

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

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

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

于 2013-05-19T17:08:29.747 回答