2014-11-24 100 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