[JPA] 영속성 전이와 고아 객체
1. 영속성 전이
- 특정 엔티티를 영속 상태로 만들 때, 연관된 엔티티(보통 자식 엔티티)도 함께 영속 상태로 만드는 것
- 왜 사용할까?
- JPA에서 엔티티의 값을 변경할 때 엔티티가 영속상태가 되어야 한다.
- 따라서 부모 객체를 영속 상태로 만들때 그와 관련된 자식 객체를 영속상태로 바꾸어 간편하게 처리할 수 있도록 돕는다.
- 왜 사용할까?
- 하나의 부모가 자식들을 관리할 때 쓴다.
- 만약 자식이 두 개 이상의 연관관계가 있으면 사용하면 안됨
1.1 사용법
@OneToMany(mappedby = "parent", cascade = CascadeType.PERSIST)
private List<Child> child = new ArrayList<>();
@XXXtoXXX
에 추가로cascade
옵션을 붙혀주면 된다.옵션의 종류
옵션 정보 CascadeType.ALL
모두 적용 CascadeType.PERSIST
영속 CascadeType.MERGE
병합 CascadeType.REMOVE
삭제 CascadeType.REFRESH
REFRESH CascadeType.DETACH
DETACH
- 주로
ALL
,PERSIST
,REMOVE
만 사용한다.
1.2 CascadeType.PERSIST
- 부모 엔티티를 저장할 때 연관된 자식 엔티티도 같이 저장한다.
1.3 CascadeType.REMOVE
- 부모 엔티티를 삭제할 때 연관되어 있는 자식 엔티티도 같이 삭제한다.
1.4 CascadeType.ALL
CascadeType.PERSIST
+CascadeType.REMOVE
2. 고아객체(Orphan)
- 부모 엔티티와 연관 관계가 끊어진 자식 엔티티
- 옵션으로 부모 엔티티와 연관 관계가 끊어진 자식 엔티티를 자동으로 삭제할 수 있습니다.
orphanRemoval = true
3. CascadeType.REMOVE
과 orphanRemoval=true
의 차이
CascadeType.REMOVE
는 '부모 엔티티가 삭제'되면 자식 엔티티가 삭제된다.- 만약, 부모 엔티티에서 자식의 연관관계를 끊으면 어떻게 될까? ex)
list.remove(0);
- 연관 관계만 끊긴것이지 delete 쿼리는 따로 나가지 않는다.
- → 이 때, 연관 관계를 끊는 것으로 delete 쿼리를 보내고 싶으면
orphanRemoval=true
옵션을 주면 된다.
- 만약, 부모 엔티티에서 자식의 연관관계를 끊으면 어떻게 될까? ex)
orphanRemoval=true
는 부모 엔티티와 자식 엔티티의 '연관 관계가 사라'지면 삭제된다.CascadeType.REMOVE
와 마찬가지로 부모 엔티티가 삭제되면 자식과 부모의 연관 관계가 사라져 자식 엔티티가 삭제된다.
※ 참고
- JPA - CASCADE , 영속성 전이
- [JPA] 영속성 전이(cascade)와 고아 객체
- JPA 영속성 전이 (CASCADE) 와 고아 객체(ORPHAN)
- [JPA CascadeType.REMOVE vs orphanRemoval = true
'ORM > JPA' 카테고리의 다른 글
[JPA] 엔티티의 생명주기와 Spring Data JPA- (1) (0) | 2022.10.08 |
---|---|
자바 ORM 표준 JPA 프로그래밍 - 객체지향 쿼리 언어 (0) | 2021.08.22 |
자바 ORM 표준 JPA 프로그래밍 - 값 타입 (0) | 2021.08.21 |
자바 ORM 표준 JPA 프로그래밍 - 프록시와 연관관계 관리 (0) | 2021.08.19 |
자바 ORM 표준 JPA 프로그래밍 - 고급 매핑 (0) | 2021.08.16 |