JPA Cascade와 OrphanRemoval

Minyuk·2023년 1월 21일
0
post-thumbnail

Cascade

  • cascade는 @OneToMany나 @ManyToOne에 설정할 수 있는 옵션
  • Entity의 상태 변화가 있으면 연관되어 있는 다른 Entity에도 상태변화를 전이
  • 기본적으로는 아무 것도 전이 시키지 않음

Entity 상태

  1. Transient : 객체를 생성하고, 값을 주어도 JPA나 hibernate가 그 객체에 관해 아무것도 모르는 상태
    -> 데이터베이스와 매핑된 것이 아무것도 없다.
  2. Persistent : save()를 하고나서, JPA가 관리하는 상태
    -> 바로 DB에 이 객체에 대한 데이터가 저장되지 않음
    -> JPA가 persistent 상태로 관리하고 있다가, 후에 데이터를 저장
    -> 1차 캐시, Dirty Checking(변경 감지), Write Behind(최대한 늦게, 필요한 시점에 DB에 적용)
  3. Detached : JPA가 더이상 관리하지 않는 상태
  4. Removed : JPA가 관리하지만 실제 commit이 일어날 때 삭제

CASCADE 종류

  • ALL : 모두 적용
  • PERSIST : 영속
  • MERGE : 병합
  • REMOVE : 삭제
  • REFRESH : Refresh
  • DETACH : DETACH

OraphanRemoval

고아 객체(Orphan) 제거(Removal)

  • JPA에서는 부모 엔티티와 연관관계가 끊어진 자식 엔티티를 자동으로 삭제하는 기능을 제공
  • 부모 엔티티의 컬렉션에서 자식 엔티티의 참조만 제거하면 자식 엔티티가 자동으로 삭제

영속성 전이 + 고아 객체

  • 일반적으로 엔티티는 EntityManager.persist()를 통해 영속화하고 remove()를 통해 제거되며 엔티티 스스로 생명주기를 관리
    -> CascadeType.ALL + orphanRemoval = true를 동시에 사용하면 부모 엔티티를 통해서 자식의 생명주기 관리 가능
profile
학습 내용 기록하기

0개의 댓글