1. 고아객체
- 고아 객체 제거: 부모 엔티티와 연관관계가 끊어진 자식 엔티티 를 자동으로 삭제
- orphanRemoval = true
- Parent parent1 = em.find(Parent.class,id);
- parent1.getChildren().remove(0);
- //자식 엔티티를 컬렉션에서 제거
- DELETE FROM CHILD WHERE ID=?
고아가 되면 자동으로 삭제됩니다. 즉, 연관관계가 끊어지면 delete 쿼리가 나갑니다.
parent에서 child를 관리할 때
remove후 flush가 될때 delete 쿼리가 나갑니다.
이처럼 잘못사용하면 위험합니다. 특정 엔티티가 개인 소유할 때 사용합니다. 또한 아래코드에서 parent를 지우면 자식들이 모두 delete 됩니다.
CascadeType.REMOVE (ALL)을 해두면, em.remove 지우면 child,parent 다 지웁니다.(전파) 라이프사이클을 영속성 컨텍스트로합니다. 2개다 활성화하면 부모를 통해 자식의 생명주기를 관리가능합니다. 중요한건 parent는 영속성 컨텍스트로 생명주기를 관리하는데, child는 생명주기를 parent로 관리합니다. 이게 도메인주도설계(DDD)의 Aggregate Root 개념을 구현할 때 유용합니다.
REFERENCE
https://www.inflearn.com/course/ORM-JPA-Basic
'JPA' 카테고리의 다른 글
[JPA] 값타입과 불변 객체 (0) | 2020.04.26 |
---|---|
[JPA] 임베디드 타입(복합 값 타입) (0) | 2020.04.26 |
[JPA] 영속성전이(CASCADE)와 고아 객체 (0) | 2020.04.22 |
[JPA] 즉시로딩과 지연로딩 (0) | 2020.04.22 |
[JPA] 프록시 (0) | 2020.04.22 |