-
a collection with cascade="all-delete-orphan" was no longer referenced by the owning entity instance 발생 시Spring 2022. 2. 16. 21:30
연관관계를 가지고 있는 한 객체를 바꾸려고 할 때 다음과 같은 오류가 발생하였다.
a collection with cascade=”all-delete-orphan” was no longer referenced by the owning entity instance
원인
@Entity class Parent { @OneToMany(mappedBy="parent", cascade=CascadeType.ALL, orphanRemoval=true) private List children; public void setChildren(List list){ this.children = list } @Entity class Child { @ManyToOne @JoinColumn(name = "parentid") Parent parent; } //문제가 되는 사용부분 parent.setChildren(children);
객체가 위와 같이 일대다 연관관계를 맺고 있을 때, 1객체(parent)에서 N객체(children)를 초기화 하는 방법을 사용하여 값을 지정하도록 하였는데 이 부분 때문에 해당 오류가 발생하였다. 이 방법은 존재하는 parent와 관계에 있는 모든 children 객체를 삭제하고 값을 지정하려는 방식인데 이는 이전 컬렉션이 아무런 엔티티와 관계에 있지 않지만 세션에 남아있게 되어 해당 에러가 발생 하게 된다.
해결
@Entity class Parent { @OneToMany(mappedBy="parent", cascade=CascadeType.ALL, orphanRemoval=true) private List children; public void setChildren(List list){ this.children.clear(); this.children.add(list); } @Entity class Child { @ManyToOne @JoinColumn(name = "parentid") Parent parent; } parent.setChildren(children);
위와 같이 새로운 컬렉션을 할당하지 않고 기존 컬렉션을 비우고 추가하는 방식으로 수정해줌으로서 자식객체가 부모 객체와 연관관계를 유지한 상태로 남아있을 수 있어 부모, 자식 모두 값 변경이 되므로 해당 오류를 해결 할 수 있다.
( 참고한 사이트 )
'Spring' 카테고리의 다른 글
Validation failed for query for method public abstract 오류 발생시 (JPA) (0) 2022.03.04 CacadeType.REMOVE 와 orphanRemoval = true의 차이 (0) 2022.02.24 @ParameterizedTest사용할 때 java.lang.NoSuchMethodException 발생 시 (0) 2022.02.16 existsBy, countBy (JPA) (0) 2022.02.13 인수테스트 (Acceptance Test) ① 환경 구축 및 작성 (0) 2022.02.08