본문 바로가기
Back-End/JPA

JPA) 영속성 전이

by 어렵다어려웡 2022. 3. 12.

특정 엔티티를 영속상태로(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