코딩과 결혼합니다

[JPA] 영속성 전이(CASCADE), 고아 객체 본문

2세/JPA

[JPA] 영속성 전이(CASCADE), 고아 객체

코딩러버 2024. 2. 23. 11:33
728x90

영속성 전이

특정 엔티티를 와 함께 연관된 엔티티도 영속 상태로 만들고 싶을 때 사용한다.

@OneToMany(mappedBy = "order", cascade = ALL)
private List<OrderItem> orderItems = new ArrayList<>();
  • 영속성 전이는 연관관계를 매핑하는 것과 아무 관련이 없다.

CASCADE 종류

  • ALL : 모두 적용
  • PERSIST : 영속 - 삭제하면 안 될 때, 저장할 때만 써야 할 때
  • REMOVE : 삭제
  • 그 외...

주의할 점

  • 하나의 부모 테이블이 자식 테이블을 관리할 때에만 쓴다. (자식 테이블을 여러 곳에서 관리를 할 때에는 쓰지 않는다.)
  • 부모 테이블과 자식 테이블의 라이프 사이클이 유사할 때 사용한다.

고아 객체

부모 엔티티와 연관관계가 끊어진 자식 엔티티를 자동으로 삭제하는 기능이다.

@OneToMany(mappedBy = "order", orphanRemoval = true)
private List<OrderItem> orderItems = new ArrayList<>();

orphanRemooval = true로 설정한다.

Order order = em.find(Order.class, id);
order.getOrderItem().remove(0); //orderItem의 0번째 인덱스 삭제

자식 엔티티를 컬렉션에서 제거할 수 있다.

주의할 점

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

개념적으로 보면 CascadeType.REMOVE 와 같이 부모를 제거하면 자식은 고아가 된다.

고아 객체 제거 기능을 활성화하면 부모를 제거할 때 자식도 함께 제거된다.


영속성 전이 + 고아 객체

@OneToMany(mappedBy = "order", cascade = ALL, orphanRemoval = true)
private List<OrderItem> orderItems = new ArrayList<>();
  • 스스로 생명주기를 관리하는 엔티티는 em.persist()로 영속화, em.remove()로 제거한다.
    • 라이프 사이클을 jpa의 영속 컨텍스트를 통해서 하는 것. (DB나 repository 필요 없이)
  • 두 옵션을 모두 활성화하면 부모 엔티티를 통해서 자식의 생명 주기를 관리할 수 있다.