JPA / Hibernate:在delete set null上

时间:2014-11-24 13:42:33

标签: sql oracle hibernate jpa mapping

所以我已经注意到使用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的解决方案,但我不确定这是否和我打算一样。

提前感谢!

1 个答案:

答案 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 = ?,然后删除老板。