在@OneToMany關係如果我想要刪除一個孩子,是否需要顯式從父代的集合中刪除該孩子,或者只是刪除孩子就足夠了?JPA - 從OneToMany關係中刪除一個孩子
例如,Person
和Phone
。每個人都有很多電話號碼。如果我想刪除從一個人一個電話號碼是否足夠:
EntityManager.remove(phone);
或者我需要這個事先:
Person.getPhone().remove(phone);
不提,CascadeType的設置爲MERGE。
在@OneToMany關係如果我想要刪除一個孩子,是否需要顯式從父代的集合中刪除該孩子,或者只是刪除孩子就足夠了?JPA - 從OneToMany關係中刪除一個孩子
例如,Person
和Phone
。每個人都有很多電話號碼。如果我想刪除從一個人一個電話號碼是否足夠:
EntityManager.remove(phone);
或者我需要這個事先:
Person.getPhone().remove(phone);
不提,CascadeType的設置爲MERGE。
您需要從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
與這個問題無關。
你是對的,cascadeType在這個用例中並不重要。對實體的引用仍然有效並在引用集合中找到,它將僅處於已刪除狀態。確切地說, – atamanroman
。如果不從集合中刪除它,我認爲會拋出「參照完整性約束違例」異常。 –
不確定MERGE是否足以讓實體被刪除層疊,您可能還必須定義DELETE級聯,並根據數據如何映射(有或沒有中間的輔助表),甚至可能需要應用孤兒除去。
如果您不使用級聯進行刪除,而是使用JPA查詢或entityManager.remove(),那麼從oneToMany集合中手動驅逐它也是一個好主意。原因很簡單:可以手動從數據庫中刪除它,但這並不意味着它自動地被從集合中刪除也因此對母公司的壽命,它仍然會引用這是不應該存在的實體了。事情變得怪異的時候,你也意外地改變了實體的狀態。
我覺得OP是詢問從另一個側面取出。 –
你嘗試了嗎? – 2014-02-07 10:41:53
我想了解它而不是嘗試它。 –
感謝您的有益和友好的評論。我不知道有一個文件。 –