2009-12-28 33 views
1

目標是刪除所有者時刪除所有者。我有以下幾種類型:如何在沒有來自所有者實體的鏈接的情況下指定JPA中的依賴關係?

@Entity 
class Dependent {  
    @ManyToOne(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY, optional = false) 
    @Column(name = "OWNER") 
    private Owner _owner; 
} 

@Entity 
class Owner { 
... 
} 

在當前實現中它的所有者已被刪除後依然存在。

所有者沒有任何指向Dependent的鏈接並且無法更改,所以我不能使用@Dependent註釋或cascade = DELETE。

JPA是否支持這種「逆向依賴」? 另一個問題是,當字段_owner被刪除時,可選項=「false」保證是什麼?

回答

0

您有兩種選擇:您必須添加袋/集/列表類與cascade-delete。您可以使這個包懶惰,永遠不會訪問它,所以它不會有性能影響,直到您刪除。

您的其他選項是在刪除所有者時刪除Dependent實例和查詢。由於JPA不會自動垃圾收集實例,因此您必須手動啓動刪除操作,因此只要確保每個實例都使用單個函數來刪除所有者,然後添加調用以刪除那裏的子項。

+0

所有者類不能被修改。 是否確定JPA不提供指定依賴類中依賴項的選項?那麼「optional ='false'」是什麼意思? – oakjumper 2009-12-30 06:20:52

+0

'optional = false'只聲明哪一方負責映射;你仍然需要兩個類的映射。如果您無法更改所有者類,則必須使用原生查詢並手動完成所有操作。不要忘記每次刷新緩存。 – 2009-12-30 09:06:00

+0

您的問題是「所有者類別無法修改」。這是你必須解決的問題。您必須決定更改所有者類是否更復雜,或者花費幾個星期來調試解決方法。或者,也許你可以用HBM文件映射所有者類。如果您使用Spring,您可以輕鬆地將註釋與舊的XML配置混合使用。 – 2009-12-30 09:08:52

0

解決此問題的一種方法是使用與所有者共享相同表的子類,並添加指向該從屬的集合。 我不同意Aaron Digulla關於'optional = false'的觀點,這個陳述只顯示關聯是可選的,並且因爲你沒有雙向關聯,所以Dependent總是處理映射。

相關問題