2015-10-20 63 views
1

我使用準系統JPA與Hibernate作爲提供者 - 我沒有使用任何Hibernate特有的功能。我有一個具有@ManyToMany字段的實體,該字段映射到另一個雙列MtM表Groups,並且爲該MtM表的字段指定了CASCADE DELETE有沒有辦法控制JPA級聯刪除命令?

刪除級聯所有工作正常。問題是當我需要從數據庫中刪除我的實體之一:

String jpql = "DELETE FROM Entity e WHERE e.id = :id AND :g MEMBER OF e.groups" 
    Query tq = em.createQuery(jpql); 
    tq.setParameter("id", 42); 
    tq.setParameter("g", myGroup); 
    long rows = tq.executeUpdate(); 
    if (rows == 0) throw new Exception();  

上述查詢的第二個條件將永遠是假的,現在看來,因爲實體的MTM entity_group項實體的刪除之前被刪除發生。如果我打開查詢日誌記錄,我會看到類似這樣的:

delete from **entity_group** where (entity_id) in (select id from entity where id=?) 
delete from entity where id=? and (? in (select groups1_.group_id from **entity_group** groups1_ where entity.id=groups1_.entity_id)) 

有什麼辦法來控制什麼時候刪除排序?我真的想在主刪除之後執行這些級聯刪除,以便條件不是無用的。我也不想將這種邏輯從數據庫層拿出來。

謝謝!

回答

1

在這種情況下,最好先選擇要刪除的實體的id,然後發出第二個JPQL查詢以刪除具有此特定ID的實體。

您觀察到的行爲是特定於您的JPA提供程序的,我想對此無關緊要。或者解決方案太複雜,不可移植,不值得。

請注意,訂購不起作用。如果您先在羣組之前刪除實體,則會丟失對相關羣組的引用。在大多數情況下,由於外鍵約束,刪除實體甚至會失敗。

相關問題