2014-02-07 62 views
4

@OneToMany關係如果我想要刪除一個孩子,是否需要顯式從父代的集合中刪除該孩子,或者只是刪除孩子就足夠了?JPA - 從OneToMany關係中刪除一個孩子

例如,PersonPhone。每個人都有很多電話號碼。如果我想刪除從一個人一個電話號碼是否足夠:

EntityManager.remove(phone); 

或者我需要這個事先:

Person.getPhone().remove(phone); 

不提,CascadeType的設置爲MERGE

+1

你嘗試了嗎? – 2014-02-07 10:41:53

+1

我想了解它而不是嘗試它。 –

+0

感謝您的有益和友好的評論。我不知道有一個文件。 –

回答

7

您需要從phones集合中明確刪除Phone,但用EntityManager刪除它是不夠的。

從另一個方面,它可能是足夠使用orphanRemoval,因此,如果您從集合的實體,它就會被自動刪除。喜歡的東西:

@OneToMany(mappedBy="person", orphanRemoval="true") 
private List<Phone> phones; 

參見:http://docs.oracle.com/cd/E19798-01/821-1841/giqxy/index.html

Cascade.REMOVE只有在父實體被移除,以及移除子實體。 Cascase.MERGE與這個問題無關。

+0

你是對的,cascadeType在這個用例中並不重要。對實體的引用仍然有效並在引用集合中找到,它將僅處於已刪除狀態。確切地說, – atamanroman

+0

。如果不從集合中刪除它,我認爲會拋出「參照完整性約束違例」異常。 –

3

不確定MERGE是否足以讓實體被刪除層疊,您可能還必須定義DELETE級聯,並根據數據如何映射(有或沒有中間的輔助表),甚至可能需要應用孤兒除去。

如果您不使用級聯進行刪除,而是使用JPA查詢或entityManager.remove(),那麼從oneToMany集合中手動驅逐它也是一個好主意。原因很簡單:可以手動從數據庫中刪除它,但這並不意味着它自動地被從集合中刪除也因此對母公司的壽命,它仍然會引用這是不應該存在的實體了。事情變得怪異的時候,你也意外地改變了實體的狀態。

+0

我覺得OP是詢問從另一個側面取出。 –