JPA/Hibernate:删除时设置为空

roq*_*str 5 sql oracle mapping hibernate jpa

所以我已经注意到没有简单的解决方案可以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;
}
Run Code Online (Sandbox Code Playgroud)

这是它在 SQL 中的工作方式:

ALTER TABLE EMPLOYEE
ADD CONSTRAINT CONSTRAINTNAME FOREIGN KEY (BOSS)
REFERENCES EMPLOYEE (ID)
ON DELETE SET NULL;
Run Code Online (Sandbox Code Playgroud)

我不希望没有老板的人也被解雇,我只是希望他们不再提及他们以前的老板。我看到了使用 @PreRemove 的解决方案,但我不确定这是否与我打算的一样。

提前致谢!

isa*_*sah 4

是的,这@PreRemove()是一个好方法。但你需要在反面有双向关联,这意味着Employee应该有一个@OneToManywith Employee(受监督的员工)。然后添加这个方法Employee

@PreRemove
private void removeAssociationsWithChilds() {
   for (Employee e : employees) {
        e.setBoss(null);
   }
}
Run Code Online (Sandbox Code Playgroud)

但是,如果您不想进行相反的跟踪,也就是说,如果您不想使用 来获得老板监督下的员工列表@OneToMany,那么您必须在删除之前通过 HQL 手动执行此操作,比如update Employee e set e.boss = null where e.boss = ?,然后删除boss。