728x90
영속성 전이: CASCADE
특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속상태로 만들고 싶을 때
예: 부모 엔티티를 저장할 때 자식 엔티티도 함께 저장하는 경우
@OneToMany(mappedBy="parent", cascade=CascadeType.PERSIST)
주의사항
영속성 전이는 연관관계를 매핑하는 것과 아무 관련이 없다.
엔티티를 영속화할 때 연관된 엔티티도 함께 영속화하는 편리함을 제공할 뿐이다.
단일 소유자일 때 사용하는 것이 좋다.
CASCADE의 종류
- ALL: 모두 적용
- PERSIST: 영속
- REMOVE: 삭제
- MERGE: 병합
- REFRESH: 리프레쉬
- DETACH: 분리
고아 객체
- 부모 엔티티와 연관관계가 끊어진 자식 엔티티를 의미한다.
- 고아 객체 제거: 부모 엔티티와 연관관계가 끊어진 자식 엔티티를 자동으로 삭제한다.
- orphanRemoval = true
@OneToMany(mappedBy="parent", cascade=CascadeType.PERSIST, orphanRemoval = true)
...
Parent parent1 = em.find(Parent.class, id);
parent1.getChildren().remove(0); //자식 엔티티를 컬렉션에서 제거
주의 사항
- 참조가 제거된 엔티티는 다른 곳에서 참조하지 않는 고아 객체로 보고 삭제하는 기능이다.
- 참조하는 곳이 하나일 때만 사용해야 하고, 특정 엔티티가 개인 소유할 때 사용한다.
- @OneToOne, @OneToMany만 가능하다.
- 참고: 고아 객체 제거 기능을 활성화 하면, 부모를 제거할 때 자식도 함께 제거된다. 이것은 CascadeType.REMOVE처럼 동작한다.
영속성 전이 + 고아 객체
CascadeType.ALL +orphanRemoval = true
- 두 옵션을 모두 활성화 하면 부모 엔티티를 통해서 자식의 생명 주기를 관리할 수 있다.
- 스스로 생명주기를 관리하는 엔티티는 em.persist()로 영속화, em.remove()로 제거한다.
- 도메인 주도 설계(DDD)의 Aggregate Root 개념을 구현할 때 유용하다.
728x90
'💻dev > 🌱Java+Spring' 카테고리의 다른 글
JPA | 값 타입은 변경이 가능할까? 불변 객체(immutable object)란? (+ 값 타입을 비교하는 방법) (0) | 2023.05.02 |
---|---|
JPA | 기본값 타입과 임베디드 타입이란? (0) | 2023.05.01 |
JPA | 즉시 로딩(FetchType.EAGER)과 지연 로딩(FetchType.LAZY) (0) | 2023.05.01 |
JPA | 프록시(Proxy)란? 제대로 알고 쓰자! (0) | 2023.05.01 |
JPA | 예제로 알아보는 상속관계 매핑 (예제-4) (0) | 2023.05.01 |