2017-04-27 101 views
1

我們有這樣的關係:休眠5 + JPA 2不級聯刪除了連接表

public class RuleProviderEntity implements Serializable 
{ 
    ... 
    @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER) 
    @OrderColumn(name = RuleEntity.RULE_SEQUENCE) 
    private List<RuleEntity> rules; 
} 

僅這一點就創建一個連接表2個鍵和RULE_SEQUENCE列。到目前爲止很好,適用於SELECT。

現在有一個JQL查詢

DELETE FROM RuleProviderEntity WHERE ... 

但這不能級聯刪除RuleEntity行。它只是刪除了RuleProviderEntity,並且保留了完整的RuleEntity

這是應該在JPA 2中工作,它是一個Hibernate的bug,或者我在配置中丟失了一些東西?

我知道我可以添加@JoinTable但它只會覆蓋默認值。
另外orphanRemoval在這裏似乎沒有必要。
也許我可以用@PreRemove做一個解決方法,但不知道如何。

回答

3

您的意思是發出JPQL批量刪除查詢?而不是em.remove()

批量刪除查詢絕不會考慮級聯語義,並且不打算(也不會保留內存中的託管對象與數據存儲一致)。如果你想級聯,那麼你需要撥打em.remove()。如果對JPA規範的這種看法有疑問。

+0

好的謝謝。我迄今沒有使用批量刪除,所以我從來不知道:)但我很驚訝規範不需要可選的級聯。 –

+0

我的想法是這樣的: 可能有一個實體具有相同的'RuleEntityProvider'集合,與大容量的'DELETE'相匹配。如果我調用'em.remove()',它將會級聯,並且第三級嵌套的'RuleEntity'實體也將被刪除。那麼爲什麼不從DELETE語句中級聯呢。 –

+0

不能明白爲什麼任何級聯應該是可選的。批量刪除可以在不需要從數據存儲中獲取數據的情況下進行批量操作,並且由於「級聯」需要JPA提供者檢查所有要刪除的對象,計算級聯,然後刪除這些等,因此無法完成。 –