Sql JPA/Hibernate:在删除时设置null

Sql JPA/Hibernate:在删除时设置null,sql,oracle,hibernate,jpa,mapping,Sql,Oracle,Hibernate,Jpa,Mapping,因此,我已经注意到,对于JPA,在delete set null上使用并没有简单的解决方案,但我听说可能有解决办法。 我的问题是下一个(这里有点抽象,但我希望它仍然有意义): 假设有员工。每个员工都认识他们的老板,但不是相反。老板本身就是雇员 我正在努力实现的目标: 如果一个老板被解雇,每个在他手下工作的人都会失去他的老板(显然) 以下是它在SQL中的工作方式: ALTER TABLE EMPLOYEE ADD CONSTRAINT CONSTRAINTNAME FOREIGN KEY (BOS

因此,我已经注意到,对于JPA,在delete set null上使用
并没有简单的解决方案,但我听说可能有解决办法。
我的问题是下一个(这里有点抽象,但我希望它仍然有意义):

假设有员工。每个员工都认识他们的老板,但不是相反。老板本身就是雇员

我正在努力实现的目标:

如果一个老板被解雇,每个在他手下工作的人都会失去他的老板(显然)

以下是它在SQL中的工作方式:

ALTER TABLE EMPLOYEE
ADD CONSTRAINT CONSTRAINTNAME FOREIGN KEY (BOSS)
REFERENCES EMPLOYEE (ID)
ON DELETE SET NULL;
我不希望没有老板的人也被炒鱿鱼,我只希望他们失去与前老板的联系。 我看到了使用@PreRemove的解决方案,但我不确定这是否与我打算的相同

提前谢谢

@PreRemove()
是一个好方法。 但是您需要在相反的一侧具有双向关联,这意味着
员工
应该与
员工
有一个
@OneToMany
(受监管的员工)。然后在
Employee
中添加此方法:

@PreRemove
private void removeAssociationsWithChilds() {
   for (Employee e : employees) {
        e.setBoss(null);
   }
}

但是,如果您不想跟踪相反的方面,也就是说,如果您不想让老板使用
@OneToMany
来监督员工列表,那么您必须在删除之前通过HQL手动执行,例如
更新员工e set e.boss=null,其中e.boss=?
,然后删除boss。

实际上我使用了@OneToOne关联,忘了添加它。那会是什么样子呢?几乎是一样的,只是你需要一个
@OneToOne
而不是
@oneToMany
,然后在
上删除关联swithchilds(){employeeUnderSupervision.setBoss(null)}
老板最多有一个
员工在监督之下,所以它可以作为一个属性
@OneToOne>列出(mappedBy=“boss”)私人员工employeeUnderSupervision;
这就是为什么
删除与Childs()的关联({employeeUnderSupervision.setBoss(null);}
我现在的问题(可能只是理解的问题)我目前持有的员工是老板。老板不认识任何称他为老板的员工。我可以访问老板的老板。这就是我提到双向关系的原因。对于他们,员工(所有者方)保留对老板的引用。老板(反向方)还保留对受监管员工的引用(此引用使关系具有双向性,这是可选的,但很有用)。如果不想使用双向关系,则必须使用HQL查询方法。
@PreRemove
private void removeAssociationsWithChilds() {
   for (Employee e : employees) {
        e.setBoss(null);
   }
}