영속성 전이

Transitive Persistence

영속성 전이: CASCADE

  • 특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속상태로 만들고 싶을 때
  • ex) 부모 엔티티를 저장할 때 자식 엔티티도 함께 저장.

영속성 전이: 저장

@OneToMany (mappedBy=”parent”, cascade=CascadeType.PERSIST)

// Parent Entity
//@OneToMany (mappedBy="parent")
//Private List<Child> childList = new ArrayList<>();

Child child1 = new Child();
Child child2 = new Child();

Parent parent = new Parent();
parent.addChild(child1);
parent.addChild(child2);

em.persist(parent);
em.persist(child1);
em.persist(child2);
// Parent Entity에 persist 추가
//@OneToMany (mappedBy="parent", cascade=CascadeType.PERSIST)
//Private List<Child> childList = new ArrayList<>();

Child child1 = new Child();
Child child2 = new Child();

Parent parent = new Parent();
parent.addChild(child1);
parent.addChild(child2);

em.persist(parent);
// 부모 영속화하면 자동으로 자식은 영속화 해줌

영속성 전이: CASCADE - 주의!

  • 영속성 전이는 연관관계를 매핑하는 것과 아무 관련이 없음
  • 엔티티를 영속화할 때 연관된 엔티티도 함께 영속화하는 편리함을 제공할 뿐
  • Parent와 Child Entity의 LifeCycle이 비슷할 때 사용
  • 특정 엔티티가 개인 소유할 때 사용

CASCADE의 종류

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

고아 객체

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

고아 객체 - 주의

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

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

@OneToMany (mappedBy="parent", cascade=CascadeType.PERSIST, orphanRemoval = true)
Private List<Child> childList = new ArrayList<>();
  • CascadeType.ALL + orphanRemovel = true
  • 스스로 생명주기를 관리하는 엔티티는 em.persist()로 영속화, em.remove()로 제거
  • 두 옵션을 모두 활성화 하면 부모 엔티티를 통해서 자식의 생명주기를 관리할 수 있음

CASCADE REMOVE vs orphanRemoval = true

위에 내용들을 공부하다보니 CASCADE중 REMOVE와 orphanRemoval = true의 차이가 뭘까하고 궁금증이 생겼다.

  • 알아본바에 의하면 둘다 부모 엔티티가 삭제되면 자식 엔티티가 삭제되는 것은 동일하다.
  • 하지만 삭제가아니라 관계를 제거하는경우에 차이가 있었다.
    • REMOVE같은 경우 부모 엔티티가 자식 엔티티와의 관계를 제거해도 자식 엔티티는 삭제되지 않고 그대로 남아있다.
    • orphanRemoval = true 같은 경우 부모 엔티티가 자식 엔티티의 관계를 제거하면 자식은 고아로 취급되어 삭제된다.

=> 무작정 쓰지 말고 영속성 전이를 사용하든 orphanRemoval을 사용하든 주의하여 사용하자


참고: JPA

*틀린 부분이 있으면 언제든지 말씀해 주시면 공부해서 수정하겠습니다.


© 2022. All rights reserved.

Powered by 애송이