2014-02-07 4 views
4

@OneToMany 관계 어린이를 삭제하려면 해당 자식을 부모 컬렉션에서도 명시 적으로 삭제해야합니까, 아니면 자식 삭제만으로 충분합니까?JPA - OneToMany 관계에서 자식 삭제

예 : PersonPhone. 각 사람마다 전화 번호가 많습니다.

EntityManager.remove(phone); 

아니면 내가 사전에이에 필요 : 나는 사람에서 하나 개의 전화 번호를 삭제하려면이 충분하다

Person.getPhone().remove(phone); 

는 언급하지 않기는 CascadeTypeMERGE로 설정.

+1

시도해 보셨습니까? –

+1

나는 그것을 시험하기보다는 이해하고 싶다. –

+0

도움이되고 친절한 의견을 보내 주셔서 감사합니다. 나는 문서가 있다는 것을 전혀 몰랐다. –

답변

7

컬렉션에서 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가 상대방으로부터 제거를 요구하고 있다고 생각합니다. –