2009-12-03 5 views
1

콜렉션이 지워질 때 고아가 삭제 되더라도 Hibernate는 콜렉션을 null로 설정할 때 고아를 삭제하지 않습니다. 나는 다음과 같은 연관이있다. E는 D에 포함되기 때문에, 데이터베이스는 E D. 따라서 I의 단위로 D/E 참조 의지 밖에있는 아이덴티티가 없다고Hibernate DELETE_ORPHAN CascadeType 컬렉션이 null로 설정된 경우 고아를 삭제하지 않음

D - entity, contains a single embedded E 
E - embedded object, contains one to many relationship with F (cascade type all,DELETE_ORPHAN) 
F - entity, contains a collection of Strings 

참고. 또한 F에는 문자열 모음이 포함되어 있습니다. 최대 절전 모드의 한계로 인해 F는 임베디드 값 유형이 아닌 엔터티 여야 함을 의미합니다. E에있는 F의 콜렉션의 계단식 유형에는 모두 및 DELETE_ORPHAN이 포함됩니다.

D/E에서 F의 콜렉션을 제거하려면 콜렉션에서 F를 모두 명시 적으로 제거 할 수 있습니다. 내가 기대하는 것처럼

D d = //get a reference to a D 
E e = d.getE(); 
Set<F> fs = e.getFs(); 
fs.clear(); 
//... update d in the session 

이 제대로 모든 F 테이블에서 D/E에 관한 Fs를위한 데이터베이스 행과 F에 D/E에서 관련 행 테이블을 조인을 제거합니다. 그러나 Fs 컬렉션을 null로 설정하려고한다고 가정 해 보겠습니다. 이 조인 테이블의 D/E와 F 사이의 관계를 삭제하지만

D d = //get a reference to a D 
E e = d.getE(); 
e.setFs(null); 
//... update d in the session 

, 그것은 F 테이블에서 D/E에 관한 Fs를위한 데이터베이스 행을 제거하지 않습니다. 이러한 데이터베이스 행은 이제 고아가되었습니다.

F의 모음을 null로 설정하고 최대 절전 모드로 전환하여 해당 원래 모음의 모든 F가 고아가되었음을 알 수있는 최대 절전 모드 설정이 있습니까?

답변

4

그리고 Hibernate가 당신의 모든 F 엔티티들을 삭제해야한다는 것을 어떻게 알고 있다고 생각하십니까?

Transitive persistence은 접근성이 필요합니다. Hibernate가 모든 (또는 어떤) 콜렉션 요소들이 삭제되었다는 것을 알기 위해서 콜렉션 클래스들을 그 변경들을 추적하는 콜렉션 클래스로 대체한다.

절대 일단 생성/인스턴스화 된 컬렉션에 대한 참조를 제거하십시오. 변경하면 변경 사항이 손실됩니다 (자동으로 뒤에서 또는 예외가 발생할 수 있음).

clear()을 사용하면 Hibernate에게 삭제 된 콜렉션 요소를 원하게하는 올바른 방법이다.

+0

정보 주셔서 감사합니다! E가 null로 설정되면 F 엔티티는 삭제되지 않습니다. 이것은 또한 도달 가능성이 부족하기 때문입니까? E가 null로 설정되면 F 고아를 삭제하도록 이러한 연결을 구성하는 더 좋은 방법이 있을까요? –

+0

'E'가 실제로 ** 임베디드 ** 인 경우, 그것을 null로 설정하는 것은 Hibernate의 견해와 똑같이'F'의 콜렉션을 null로 설정하는 것과 동일하다 (Hibernate 문서의 구성 요소에 대한 장 참조). 만약'E'가 엔티티라면 명시 적으로 삭제해야 할 것입니다. 만약 그 자체가'D'의 콜렉션 엘리먼트라면 cascade = all-delete-orphan이라고 가정하고 컬렉션에서 제거 할 수 있습니다. – ChssPly76

관련 문제