@OneToMany 관계시 발생한 에러
- Error
- 2021년 4월 11일
JPA의 구현체인 hiberante를 이용해서 엔티티간의 상속관계를 설정하고 처음 사용해보는데 발생한 에러인 A collection with cascade=“all-delete-orphan” was no longer referenced by the owning entity instance 문제 해결한 방법을 기록하려고 한다.
User의 엔티티와 Customer엔티티간의 1:N 양방향 연관관계를 맺기 위해 User에는 @OneToMany를 Customer에는 @ManyToOne관계를 설정을 하고 로직을 돌려보는데 위와 같은 에러가 발생했다.
문제점1. 초기화 부재
public class User{
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Customer> customers;
}
연관관계를 위 코드처럼 작성을 했는데, 새로운 User를 선언하거나 수정할때 해당 cutomer가 null이 되서 아무 것도 참조하지 않는다고 에러가 뜬 것이었다.
엔티티를 영속 상태로 만들때 컬렉션 필드를 효율적으로 관리하기 위해 하이버네이트에서 미리 만들어둔 Wrapper클래스로 감싸(변경하여) 저장하기 때문에 즉시 초기화해서 사용하는 것을 권장한다고 한다.
- PersistentBag : Collection/List (중복 허용o / 순서 x)
- PersistentSet : Set (중복 허용 x / 순서 x)
- PersistentList : List + @OrderColumn (중복 허용 o / 순서 o)
해결방법
public class User{
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Long id;
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Customer> customers = new ArrayList<>(); //리스트 초기화 추가
}
초기화 문제이기 때문에 위와 같이 처음부터 비어있는 ArrayList를 갖도록 바꾸어 주어 해결했다.