[英]Hibernate, many-to-one and delete
假設您有從A類到B類的單向一對多關聯,如下所示:
public class A {
@OneToMany(cascade = CascadeType.ALL)
private List<B> myBs;
}
public class B {
//I know nothing about A
}
在數據庫中,這些通過第三個表連接,保持其ID。
現在,我想刪除一個連接到A的B對象.A有自己的存儲庫類,B有自己的存儲庫類。
在我的項目的類似設置中完成此操作的方法是首先要求有問題的A刪除有問題的B,然后告訴EnitityManager
從數據庫中刪除B.
這讓我在兩個選擇之間陷入困境,在這兩個選擇中,它們都不是我的最佳選擇:
BRepository
的存儲庫方法處理從連接到的A中刪除B,以及通過EntityManager
從數據庫中刪除。 我不喜歡這個,因為B的存儲庫類必須操縱A對象。
BRepository中的存儲庫方法僅處理通過EntityManager的刪除,將其留給調用者將其從A的集合中刪除。 我更喜歡這個,因為如果有人在沒有首先從A的集合中刪除B的情況下調用存儲庫,它將會失敗。
在這兩個中,我發現第一個是迄今為止最好的。 但是,我並不認為這很干凈。
Hibernate中是否有一些構造允許刪除項目,從數據庫中刪除后,它將從其所屬的任何集合中刪除? (試圖刪除B失敗,因為包含它的A也在同一個事務中加載,所以它在事務結束時失敗,當它試圖存儲被刪除的東西時。)
(在A中的@OneToMany-mapping
上添加mappedBy
會解決問題嗎?)
通過使用孤兒刪除,我找到了解決這個問題的方法。
通過將A中的映射更改為:
public class A {
@OneToMany(cascade = CascadeType.ALL)
@Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
private List<B> myBs;
}
我可以說
a.getMyBs().remove(b);
和b
將在被刪除a
被持續。
走出Hibernate思維定勢之外,問問自己:誰擁有B
?
業主最終對其財產負責。 通常,如果沒有A
的B
不存在A
並且每個B
僅由一個A
擁有,則這是正確A
。
因此,如果A
擁有B
s,則ARepository
負責清理B
s。 我想創建一個方法ARepository
,做清理和調用刪除方法BRepository
。
如果您確實希望將存儲庫分開,則另一個選項是在頂部創建一個知道兩者的服務類,並將以與您的選項1方法類似的方式為您處理刪除。
(在A中的@ OneToMany-mapping上添加mappedBy會解決問題嗎?)
我認為這取決於他的存儲庫實現。 對於JPA EntityManager,如果會話已關閉,當您刪除B時,即使它是雙向映射,也將分離。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.