특정 엔티티를 영속상태로(Persist) 만들고 싶을 때 연관된 엔티티도 함께 영속상태로 만들고 싶다면
영속성 전이 기능을 사용하면 된다.
Cascade 옵션으로 영속성 전이를 제공한다.
해당 기능을 이용하면 부모 엔티티를 저장할 때 자식의 엔티티도 같이 저장이 가능해진다.
위 코드로 부모와 자식 엔티티를 영속상태로 만들기 위해서는 3번의 persist 를 호출해야 한다.
em.persist(parent);
em.persist(child1);
em.persist(child2);
하지만 만약 영속성 전이를 설정했을 경우에는 부모를 영속화 하는 것으로
자식엔티티 또한 같이 영속화 되어 저장된다.
@OneToMany(cascade = CascadeType.PERSIST)
private List<Child> children = new ArrayList<>();
child1.setParent(parent);
child2.setParent(parent);
em.persist(parent);
영속성 전이는 연관관계 매핑과는 무관하며, 단지 엔티티 영속화시
연관된 엔티티도 같이 영속화 하는 편리함을 제공하는 것 뿐이다.
영속성 전이 : 삭제
만약 부모와 자식 엔티티를 모두 삭제하고 싶다면?
em.remove(child1);
em.remove(child2);
em.remove(child3);
영속성 전이시 삭제도 마찬가지이다.
CascadeType.REMOVE 로 설정하고 다음 코드처럼 부모 엔티티만 삭제하면 연관된 자식 엔티티도 함께 삭제된다.
Parent findParent = em.find(Parent.class, 1L);
em.remove(findParent);
코드를 실행하면 Delete Sql이 3번 실행되고 연관된 자식 또한 모두 삭제된다.
삭제순서는 외래 키 제약조건을 고려하여 자식이 먼저 삭제된다.
만약 Cascade 설정을 하지 않았다면 외래 키 무결성 예외가 발생한다.
종류
Cascade 에는 여러가지 옵션이 존재한다.
ALL
PERSIST
MERGE
REMOVE
REFRESH
DETACH
다음 처럼 여러 속성을 지정할 수도있다.
cascade = {CascadeType.PERSIST, CascadeType.REMOVE}
두 설정은 em.remove() 실행시 바로 전이가 발생하는게 아니라 플러시가 호출될 때 전이가 발생한다.
'Back-End > JPA' 카테고리의 다른 글
JPA) 값 타입 컬렉션 vs @OneToMany (0) | 2022.03.12 |
---|---|
JPA) 객체지향 쿼리 (0) | 2022.03.12 |
JPA) Eager, Lazy 로딩 (0) | 2022.03.12 |
JPA ) 연관관계 매핑 (0) | 2022.03.11 |
JPA) 병합 merge (0) | 2022.03.11 |