A collection with cascade="all-delete-orphan" was no longer referenced by the owning entity instance - jpa 에러

jiaLEE·2022년 9월 14일
0

jpa를 활용해서 값을 넣으려고 하는데 계속해서 아래와 같이 에러가 뜬다.
도대체 이유가 뭘까?

jpa를 통해 삭제하고 update하는 과정에 하이버네이트가 객체를 잃어버려서 생긴 오류라고 생각했다.

nested exception is org.hibernate.HibernateException: A collection with cascade="all-delete-orphan" was no longer referenced by the owning entity instance: 
객체 파일 위치
org.springframework.orm.jpa.JpaSystemException: A collection with cascade="all-delete-orphan" was no longer referenced 
by the owning entity instance: 객체 파일 위치
nested exception is org.hibernate.HibernateException: A collection with cascade="all-delete-orphan" was no longer referenced by the owning entity instance: 
객체 파일 위치

다른 객체와 연결해서 db를 저장할 때, 매핑관계를 제대로 확인해야 한다.
예를 들어 서점에서 책을 저장하는 코드를 짠다고 한다면

@Entity 
@Getter @Setter
public class BookStore {

	@Id @GeneratedValue
    private Integer id;
    
    private String name;
    
    @OneToMany(mappedBy = "bookStore")
    private Set<Book> books = new HashSet<>();
    
    public void add (Book book) {
    	book.setBookStore(this); //이 부분 필수
        this.books.add(book);
    
    }
   
}
  • mappedBy
    서로 다른 두 개의 단방향 관계를 mappedBy를 통해 양방향으로 만든다.
    mappedBy가 있는 쪽이 참조 당하는 쪽이고, 없는 쪽이 주인이다.
    (위의 코드 상에서는 book 이 주인이 되고 bookStore이름으로 참조하고 있는 것이다.)
    "주인이다 == 관계가 설정되어야 한다."
    즉, add 메소드가 bookstore에서만 변경이 일어나면 실제 내가 원하는 대로의 변화가 일어나지 않는다.
    (원하는 변화: 도서를 저장할때 책방의 pk값이 담긴다.)
    add 메소드에 book을 가지고 와서 변경 시켜야지 db상의 변화가 일어난다.

출처: 백기선 JPA, OneToMany 양방향 관계 "MappedBy" 해설
https://www.youtube.com/watch?v=hsSc5epPXDs

0개의 댓글