在ManyToOne关系中使用Cascade

时间:2013-05-19 13:08:49

标签: hibernate jpa entity cascade

在Hibernate实体的Cascade关联的两边使用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;
    }

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

但是,关系的所有者是Employee。因此,我的问题是,什么是适当的正确选择,在哪里放置cascadeType.PERSIST。我可以根据特殊需要选择双方中的一方,还是我可以把它放在两边?如果我将其放在Department方面,以下代码是否也会保存Employees,考虑到Employee是该关系的所有者

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。< / p>

1 个答案:

答案 0 :(得分:2)

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

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

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

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

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