-
영속성 전이와 고아 객체개발/JPA 2023. 7. 13. 13:43
사용법은 쉬우니까 개념만 짧게 정리하자.
영속성 전이(CascadeType)
- 특정 엔티티를 영속 상태로 만들 때 연관 엔티티도 함께 영속 상태로 만들어준다
- 부모 엔티티를 저장할 때 자식 엔티티도 함께 저장
- 연관관계 매핑과는 관련이 없다
- 연관 엔티티를 함께 영속화하는 편리함을 제공하는 것뿐
- ALL, PERSIST, REMOVE 옵션을 많이 쓴다
- 단 하나의 부모가 자식들을 관리할 때는 유의미하게 사용할 수 있다
- 둘의 라이프사이클이 같거나 거의 유사할 때
- 연관 관계가 딱 하나의 관계에서만 나올 때(단일 소유자) - Parent만 Child를 소유
- ex. 게시물의 첨부파일(파일을 여러 곳에서 관리하는 거라면 안 되겠지)
Child child1 = new Child(); Child child2 = new Child(); Parent parent = new Parent(); parent.addChild(child1); parent.addChild(child2); manager.persist(parent); // child가 자동으로 들어갔으면 좋겠다 -> cascade
고아 객체(orphanRemoval = true)
- 부모 엔티티와 연관관계가 끊어진 자식 엔티티를 의미
- 고아 객체 제거는 무조건 하는 것이 아니다
- 참조 제거된 엔티티가 다른 곳에서 전혀 참조 하지 않는 고아 객체로 판단될 때 삭제
- 참조하는 곳이 하나일 때 사용해야함!
- 특정 엔티티가 개인 소유할 때만!
- @OneToOne, @OneToMany
- 개념적으로 부모를 제거하면 자식은 고아가 된다. 따라서 고아 객체 제거 기능을 활성화하면 부모를 제거할 때 자식도 함께 제거되며 이는 CascadeType.REMOVE처럼 동작한다
Child child1 = new Child(); Child child2 = new Child(); // orphanRemoval: O or cascade = CascadeType.ALL, Parent parent = new Parent(); parent.addChild(child1); parent.addChild(child2); manager.persist(parent); manager.persist(child1); manager.persist(child2); manager.flush(); manager.clear(); Parent findParent = manager.find(Parent.class, parent.getId()); findParent.getChildList().remove(0); // CasCadeType.ALL에서는 delete query 미발생 manager.remove(findParent); // child도 지워지는 delete query 발생
CascadeType.ALL + orphanRemoval = true
- 스스로 생명주기를 관리하는 엔티티는 manager.persist(), manger.remove()
- 두 옵션을 모두 활성화하면 부모 엔티티를 통해 자식의 생명 주기를 관리할 수 있다
이 옵션들은 엔티티의 생명주기들이 같거나 거의 비슷할 때 쓸 수 있는 것이고, 그렇지 않을 때는 따로 관리해야 한다.
비즈니스 상황에 따라 적용이 다를 것이므로 고민이 필요하다.
'개발 > JPA' 카테고리의 다른 글
페치 조인의 한계과 극복(요약 ver.) (0) 2023.07.25 MVCC=TRUE (0) 2023.07.18 일대다 연관관계를 지양하자 (0) 2023.07.18 양방향 관계 시 주의사항 (0) 2023.07.11 시퀀스 최적화 (0) 2023.07.10 - 특정 엔티티를 영속 상태로 만들 때 연관 엔티티도 함께 영속 상태로 만들어준다