cascade및 orphanremoval

Lee·2022년 4월 3일
0

JPA

목록 보기
1/1

영속성 전이: cascade

  • 특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 같이 영속 상태로 만들고 싶을 때 cascade 기능을 사용하면 된다.
  • JPA에서 엔티티를 저장할 때 모든 엔티티는 영속 상태여야 한다.
  • 영속성 전이는 연관관계를 매핑하는 것과는 아무 관련이 없다.
  • 엔티티를 영속화 할 때 연관된 엔티티도 같이 영속화하는 편리함을 제공할 뿐이다.

영속성 전이 : 저장

cascadeType.PERSIST

  • 부모를 영속화 할 때 연관된 자식들을 같이 영속화 할 수 있다.

영속성 전이 : 삭제

cascadeType.REMOVE

  • 부모와 자식 엔티티를 모두 제거하려면 각각의 엔티티를 각자 제거해야한다.
  • 영속성 전이를 사용하게 되면 부모가 삭제 시 자식 엔티티도 함께 삭제된다.
  • 삭제 순서는 외래 키 제약조건을 고려해 자식 엔티티를 먼저 삭제하고 부모 엔티티를 삭제한다.
  • cascadeType.REMOVE 없이 부모 엔티티 삭제 시
    1. 부모 엔티티만 삭제된다.
    2. 자식 테이블의 외래 키 제약조건으로 인해 외래 키 무결성 예외가 발생한다.

고아 객체

  • 부모 엔티티와 연관관계가 끊어진 자식 엔티티를 의미한다.

고아 객체 제거

orphanremoval = true

  • 부모 엔티티가 연관관계가 끊어진 자식 엔티티를 자동으로 삭제하는 것
  • 고아 객체 제거 기능은 영속성 컨텍스트를 플러시 할 때 적용된다.
  • 참조가 제거된 엔티티는 다른 곳에서는 참조하지 않는 고아 객체로 보고 삭제하는 기능이다.
  • 이 기능은 참조하는 곳이 하나일 때만 사용해야 한다 = 특정 엔티티가 개인 소유하는 엔티티에만 이 기능을 적용해야 한다
  • 위의 이유로 orphanremoval는 @OnetoOne, @OnetoMany에서만 사용할 수 있다.

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

cascadeType.ALL + orphanremoval = true

  • 일반적으로 엔티티는 EntityManager.persist()를 통해 영속화되고 EntityManager.remove()를 통해 제거
  • 엔티티 스스로 생명 주기를 관리한다는 것을 의미
  • 위의 두 옵션을 활성화 시 부모 엔티티를 통해 자식 엔티티의 생명주기를 관리할 수 있다.
profile
발전하고 싶은 백엔드 개발자

0개의 댓글