영속성 전이(CascadeType)와 고아객체

이진규·2023년 3월 29일
0

SPRING 지식 공유

목록 보기
13/17

영속성 전이(CascadeType)와 고아객체

영속성 전이란?

특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속 상태로 만들고 싶을 때 사용하는 옵션
예) 부모 엔티티를 저장할 때 자식 엔티티도 함께 저장

  • 부모 저장할 때, em.persist(parent)
  • 연관된 컬렉션안의 자식 엔티티들 모두 다 함께 영속성 컨테스트에 저장하고 싶은 경우
  • 영속성 전이 안해주면 자식 개수만큼 em.persist(child) 일일이 해줘야함 ➡ 귀찮음 😒

주의

  • 영속성 전이는 연관관계 매핑하는 것과 아무 관련 없음
  • 엔티티를 영속화할 때 연관된 엔티티도 함께 영속화하는 편리함을 제공할 뿐이다!

영속성 전이 종류

CASCADE의 종류
ALL : 모두 적용
PERSIST : 영속
REMOVE : 삭제

MERGE : 병합
REFRESH : REFRESH
DETACH : DETACH

참조하는 곳이 한군데인 경우, 하나의 부모만 자식들을 관리하는 경우에만 의미있다. 게시판과 첨부파일과 같은 관계에서만 사용해야한다!

파일을 여러 엔티티에서 관리한다. 다른 게시물에서도 관리한다하면 사용하면 안된다! parent 하나만 단독으로 관리할 때만 사용해야한다 (부모 엔티티가 하나일 때)

단일 엔티티에 종속적인 경우에 사용! (라이프 사이클이 똑같기 때문)

고아 객체란?

부모 엔티티와 연관관계가 끊어진 자식 엔티티

  • 고아 객체 제거 : 부모 엔티티와 연관관계가 끊어진 자식 엔티티를 자동으로 삭제
  • orphanRemoval = true

주의

  • 참조가 제거된 엔티티는 다른 곳에서 참조하지 않는 고아객체로 보고 삭제하는 기능
  • 참조하는 곳이 하나일 때 사용해야한다!
  • 특정 엔티티가 개인 소유할 때만 사용
    @OneToMany, @OneToOne만 가능 : 참조하는 쪽이 하나인 경우만 사용

영속성 전이 + 고아객체, 생명주기

  • CascadeType.ALL + orphanRemoval=true
  • 스스로 생명주기를 관리하는 엔티티는 em.persist()로 영속화, em.remove()로 제거
    JPA를 통해서 생명주기 관리
  • 두 옵션을 모두 활성화하면 부모 엔티티를 통해서 자식 엔티티의 생명주기를 관리할 수 있다.
  • parent와 달리 child는 생명주기를 부모 엔티티가 관리
  • 굳이 DB로 따지면 DAO나 Repository가 없어도 된다는 의미
  • 생명주기를 부모가 관리하기 때문에

영속성 전이와 고아 객체 옵션은 언제 써야하나?에 대한 고민과 답변

https://hongchangsub.com/jpa-cascade-2/

참고자료

영속성 전이와 고아 객체에 대한 자료

profile
항상 궁금해하고 공부하고 기록하자.

0개의 댓글