在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>
答案 0 :(得分:2)
首先,在您发布的代码中,员工不是该关联的所有者。如果关联是双向的,并且如果OneToMany关联因此定义为mappedBy
属性:
@OneToMany(mappedBy = "department", cascade = cascadeType.REMOVE)
private Set<Employee> employees;
(请注意,我也将该字段设为私有。永远不应使用公共字段。)
关于部门的移除:在我的公司中,当部门被移除时,其所有员工都不会被自动解雇。他们可以被分配到另一个部门,甚至可以留在公司而不受部门的影响,但是他们不会被删除。我知道你的应用程序并不一定能模拟现实世界,但是,在部门被删除时强制删除员工并不一定合理。
现在,假设映射如上,是的,您可以完美地将PERSIST级联添加到OneToMany关联。级联和所有权是正交概念。如果您希望将persist()
操作从部门级联到其员工(即,如果您想在创建部门时创建员工),则添加此级联。对于要保存的关联,由于所有者方是Employee,因此必须正确初始化employee.department字段。