본문 바로가기

Tech/JPA

[JPA] 영속성 전이 (CASCADE)

반응형

1. 영속성 전이 (CASCADE)

특정 엔티티를 영속상태로 만들 때 연관관계에 있는 엔티티도 함께 영속상태로 만들기 위해서 사용한다. 예를들어 부모 엔티티가 영속화 될 때 자식 엔티티도 영속화 되도록 한다.

 

CASCADE 를 설정한다고 해서 연관관계를 매핑에 변동은 없다. 다만 연관관계가 매핑되어 있을때 연관된 객체들의 영속화를 편리하게 해주는 것 뿐이다.

 

연관관계 매핑 어노테이션에서 cascade 옵션을 사용하여 지정한다.

 

@OneToMany(mappedBy="parent", cascade=CascadeType.ALL)
private List<Child> children = new ArrayList<>();

2. CASCADE 종류

- CascadeType.ALL: 모든 Cascade 를 적용한다.

- CascadeType.PERSIST: 엔티티를 영속화할 때, 연관된 엔티티도 함께 영속화한다.

- CascadeType.REMOVE: 엔티티를 제거할 때, 연관된 엔티티도 모두 제거한다.

- CascadeType.MERGE: 엔티티를 병합할 때, 연관된 엔티티도 모두 병합한다.

- CascadeType.REFRESH: 엔티티를 새로고침할 때, 연관된 엔티티도 모두 새로고침한다.

- CascadeType.DETACH: 엔티티를 detach 할 때, 연관된 엔티티도 모두 detach 가 되어서 변경 사항이 반영되지 않는다.

 

※ 주의사항
CASCADE 를 설정하면 연관관계에 있는 객체간의 작업이 서로에게 영향을 끼치게 된다. 그렇기 때문에 단일 엔티티에 완전히 종속적이거나 라이프사이클이 같은 객체들의 관계에 대해서만 사용해야한다.

3. 고아 객체

고아객체는 부모 엔티티와 연관관계가 끊어진 자식 엔티티를 의미한다. JPA 에서는 이러한 고아객체를 자동으로 삭제할 수 있다. 부모 엔티티에서 orphanRemoval 옵션을 true 로 주어서 자동으로 삭제하도록한다.

 

해당 엔티티를 참조하는 곳이 하나이고, 특정 엔티티가 개인 소유하는 경우에만 사용한다. 그렇지 않은 경우에 해당 엔티티를 참조하는 다른 곳에서 조회가 실패되어 문제가 발생할 수 있다.

 

@OneToOne, @OneToMany 만 사용가능한다.

 

@OneToMany(mappedBy="parent", orphanRemoval=true)
private List<Child> children = new ArrayList<>();

 

4. 영속성 전이와 CASCADE 의 생명주기

JPA 에서 em.persist(), em.remove() 를 사용하여 엔티티의 생명주기를 관리한다. 이때 엔티티는 CASCADE ALL 과 orphanRemoval 을 true 로 주어서 부모 엔티티에서 자식 엔티티의 생명주기를 관리하도록 할 수 있다. 해당 설정을 통해서 부모에서 참조하고 있는 자식 엔티티 객체를 변경, 삭제함으로 실제 자식 엔티티가 자동으로 변경, 삭제되도록 한다.

 

@OneToMany(mappedBy="parent", cascade=CascadeType.ALL, orphanRemoval=true)
private List<Child> children = new ArrayList<>();
반응형

'Tech > JPA' 카테고리의 다른 글

[JPA] JPQL 기본 문법  (0) 2022.06.18
[JPA] 값 타입  (0) 2022.06.04
[JPA] 프록시와 지연로딩  (0) 2022.05.23
[JPA] 상속관계 매핑  (0) 2022.05.23
[JPA] 연관관계 매핑 종류  (0) 2022.05.17