所以我已经注意到使用on delete set null
与JPA没有简单的解决方案,但我听说可能有解决方法。
我的问题是下一个(这里有点抽象,但我希望它仍然有意义):
想象一下,员工。每个员工都知道他们的老板,但不是相反。老板本身就是员工。
我正在努力实现的目标:
如果老板被解雇,那么在他身下工作的每个人都会失去他的老板(显然)。
@Entity
@Table(name = "employee")
public class Employee
{
@Column (name = "id" )
private String id;
@OneToOne
@JoinColumn( name = "boss" )
private employee boss;
}
这是它在SQL中的工作方式:
ALTER TABLE EMPLOYEE
ADD CONSTRAINT CONSTRAINTNAME FOREIGN KEY (BOSS)
REFERENCES EMPLOYEE (ID)
ON DELETE SET NULL;
我不希望没有老板的人被解雇,我只是希望他们失去对前任老板的提及。 我看到使用@PreRemove的解决方案,但我不确定这是否和我打算一样。
提前感谢!
答案 0 :(得分:3)
是@PreRemove()
是一个很好的方法。
但是你需要在反面进行双向关联,这意味着Employee
应该有@OneToMany
Employee
(受监管的员工)。然后在Employee
:
@PreRemove
private void removeAssociationsWithChilds() {
for (Employee e : employees) {
e.setBoss(null);
}
}
但是,如果您不想跟踪反面,这意味着如果您不想让老板使用@OneToMany
监督员工列表,那么您将不得不这样做它在删除之前通过HQL手动完成,例如update Employee e set e.boss = null where e.boss = ?
,然后删除老板。