簡體   English   中英

Hibernate,多對一和刪除

[英]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.

這讓我在兩個選擇之間陷入困境,在這兩個選擇中,它們都不是我的最佳選擇:

  1. BRepository的存儲庫方法處理從連接到的A中刪除B,以及通過EntityManager從數據庫中刪除。 我不喜歡這個,因為B的存儲庫類必須操縱A對象。

  2. 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

業主最終對其財產負責。 通常,如果沒有AB不存在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM