2017-10-15 31 views
0

我有一個非常典型的一對多關係(一個請求記錄和請求細節記錄)通過休眠,從會話中分離,修改然後在用hibernate修改後再次保存,...現在假設其中一個細節記錄在客戶端被刪除,並且我想堅持刪除它(從數據庫中刪除它)...當前邏輯執行以下操作(每次更新時):再次檢索所有從屬記錄,將客戶端輸入與持久記錄進行比較,如果有任何記錄丟失,這意味着將被刪除,因此將調用session.delete調用以刪除指定記錄......最後,實體更新session.update ....我想知道是否有另一種方法讓提供者注意到記錄被刪除而未執行此操作c比較...任何幫助?在一對多的主從關係中處理細節的刪除 - 休眠

回答

-1

你可以使用級聯刪除孤兒選項,讓您的父母改變孩子的影響,如:

@OneToMany(mappedBy = "parent", cascade = CascadeType.ALL, orphanRemoval=true) 

然後,你需要,使用Session.update()或Session.merge()來對脫管實例。這樣,您所做的任何更改都將在事務結束時保存(提交時)。

這是我的代碼示例:

session.persist(a1); 
    session.flush(); 
    session.getTransaction().commit();//a1 saved 

    session.evict(a1);//a1 detached 

    a1.getTableBs().remove(0);//remove child 

    session.beginTransaction(); 
    session.update(a1);//reattach a1 
    session.flush(); 
    session.getTransaction().commit(); 

    session.close(); 

而在像這樣我的交易休眠運行查詢的結尾刪除子:

Hibernate: 
delete 
from 
    TABLE_B 
where 
    ID=? 
+0

據我所知,孤兒拆除將無法正常工作只要孤立的對象被分離...因此,我將需要從數據庫中再次讀取整個實體...刪除指定的詳細對象,然後更新...這是相同的場景 –

+0

沒有它的工作,附加(使用合併/更新)它將刪除在提交時被刪除的子項。已經在我的本地嘗試了這一點,以確保這是可行的。 – Angga

+0

我只是在我的代碼中試過它,並且正如所料,它只在刪除完成而實體被管理完成的情況下才起作用,如果刪除在實體被管理之前完成,它將不會反映在數據庫中...只有新細節被添加但刪除的細節仍然存在於數據庫中 –