2008-11-20 154 views
116

與以下映射JPA CascadeType.ALL不會刪除我在使用JPA無法刪除孤兒節點孤兒

@OneToMany (cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "owner") 
private List<Bikes> bikes; 

我有掛在數據庫中的孤立角色的問題。

我可以使用註釋org.hibernate.annotations.Cascade Hibernate特定的標籤,但顯然我不想將我的解決方案綁定到Hibernate實現中。

編輯:看來JPA 2.0將包括對此的支持。

回答

138

如果您在Hibernate中使用它,則必須明確定義註釋CascadeType.DELETE_ORPHAN,該註釋可以與JPA CascadeType.ALL結合使用。

如果您不打算使用Hibernate,您必須首先刪除子元素,然後刪除主記錄以避免任何孤立記錄。

執行順序

  1. 取主行被刪除
  2. 取子元素
  3. 刪除所有子元素
  4. 刪除主排
  5. 關閉會話

使用JPA 2.0,現在可以使用選項orphanRemoval =真

@OneToMany(mappedBy="foo", orphanRemoval=true) 
+3

感謝我結束了走這條路,我覺得這對於JPA規範來說有些過分了。 – 2008-11-21 08:49:29

+12

JPA 2.0標準現在擁有deleteOrphan作爲@OneToMany的一個屬性 如果您使用最新的休眠,您可以執行@OneToMany(...,deleteOrphan = true) – jomohke 2010-06-11 06:33:13

+0

當我更新子元素時,執行順序是什麼?將孤兒記錄刪除? – jAckOdE 2014-05-26 07:22:53

104

如果你正在使用JPA 2.0,現在就可以使用@xxxToMany註釋的orphanRemoval=true屬性刪除孤兒。

實際上,CascadeType.DELETE_ORPHAN已經在3.5.2-Final中棄用了。

+3

+1爲這個問題提供最新的答案! – 2010-09-02 09:02:22

+5

實際上我認爲orphanRemoval = true意味着其他的東西,也就是說,當我從父母的集合中刪除一個對象時,刪除一個對象。如我所知,請參閱http://download.oracle.com/javaee/6/tutorial/doc/bnbqa.html#giqxy – Archie 2010-09-13 22:37:43

+3

它不能與@ManyToMany一起使用。 – ses 2011-03-17 18:43:41

4

我只是覺得這個解決方案但對我來說這是行不通的:

@OneToMany(cascade = CascadeType.ALL, targetEntity = MyClass.class, mappedBy = "xxx", fetch = FetchType.LAZY, orphanRemoval = true) 

orphanRemoval =真沒有效果。

2

只是@OneToMany(cascade = CascadeType.ALL, mappedBy = "xxx", fetch = FetchType.LAZY, orphanRemoval = true)

刪除targetEntity = MyClass.class,它的工作很好。

1

對於記錄,在JPA2之前的OpenJPA中它是@ElementDependant。

7

可以使用@PrivateOwned刪除孤兒 e.g

@OneToMany(mappedBy = "masterData", cascade = { 
     CascadeType.ALL }) 
@PrivateOwned 
private List<Data> dataList; 
40
╔═════════════╦═════════════════════╦═════════════════════╗ 
║ Action ║ orphanRemoval=true ║ CascadeType.ALL ║ 
╠═════════════╬═════════════════════╬═════════════════════╣ 
║ delete ║  deletes parent ║ deletes parent ║ 
║ parent ║  and orphans  ║ and orphans  ║ 
╠═════════════╬═════════════════════╬═════════════════════╣ 
║ change ║      ║      ║ 
║ children ║ deletes orphans ║  nothing  ║ 
║ list  ║      ║      ║ 
╚═════════════╩═════════════════════╩═════════════════════╝ 
2

我有同樣的問題,我不知道爲什麼這個條件之下沒有刪除孤兒。在Hibernate中(5.0.3.Final)未刪除的菜餚名單時,我執行了一個名爲刪除查詢:

@OneToMany(mappedBy = "menuPlan", cascade = CascadeType.ALL, orphanRemoval = true) 
private List<Dish> dishes = new ArrayList<>(); 

然後我想起我不能使用一個名爲刪除查詢,但EntityManager的。由於我使用EntityManager.find(...)方法獲取實體,然後使用EntityManager.remove(...)刪除它,菜餚也被刪除。

0

我用的是一對一的映射,但孩子沒有得到刪除JPA是給外鍵衝突

使用orphanRemoval = TRUE後,問題得到了解決