2014-11-24 102 views
2

所以我已经注意到有没有简单的解决方案使用JPA删除设置null,但我听说可能有解决方法。 我的问题是(它变得有点抽象这里,我希望它仍然是有道理的):JPA /休眠:在删除设置null

想有员工。每个员工都知道他们的老板,但不是相反。老板本身就是员工。

我尽力去完成什么:

如果老板被炒鱿鱼,大家谁在他的工作失去了他的老板(很明显)。

@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的解决方案,但我不确定这是否和我打算的一样。

在此先感谢!

回答

3

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

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

但是,如果你不想跟踪的反侧,这意味着如果你不想使用老板有监督下的员工列表@OneToMany,那么你必须在删除前通过HQL手动完成,比如update Employee e set e.boss = null where e.boss = ?,然后删除老板。

+0

其实我使用@OneToOne关联,忘了补充一点。那么它会怎样呢? – roqstr 2014-11-24 14:06:44

+1

几乎相同,只是你需要一个'@ OneToOne'而不是'@ oneToMany',然后在'removeAssociationsWithChilds(){employeeUnderSupervision.setBoss(null)}' – isah 2014-11-24 14:08:48

+0

老板在监督下最多只有一个'员工' ,所以它可以列为单个属性'@OneToOne(mappedBy =“boss”)private Employee employeeUnderSupervision;'这就是为什么'removeAssociationsWithChilds(){employeeUnderSupervision.setBoss(null); }' – isah 2014-11-24 14:16:02