콜렉션이 지워질 때 고아가 삭제 되더라도 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가 고아가되었음을 알 수있는 최대 절전 모드 설정이 있습니까?
정보 주셔서 감사합니다! E가 null로 설정되면 F 엔티티는 삭제되지 않습니다. 이것은 또한 도달 가능성이 부족하기 때문입니까? E가 null로 설정되면 F 고아를 삭제하도록 이러한 연결을 구성하는 더 좋은 방법이 있을까요? –
'E'가 실제로 ** 임베디드 ** 인 경우, 그것을 null로 설정하는 것은 Hibernate의 견해와 똑같이'F'의 콜렉션을 null로 설정하는 것과 동일하다 (Hibernate 문서의 구성 요소에 대한 장 참조). 만약'E'가 엔티티라면 명시 적으로 삭제해야 할 것입니다. 만약 그 자체가'D'의 콜렉션 엘리먼트라면 cascade = all-delete-orphan이라고 가정하고 컬렉션에서 제거 할 수 있습니다. – ChssPly76