JPA/Hibernate에서 Cascade가 무엇인지 알아보자!
Cascading 이란?
엔티티 관계는 종종 다른 엔터티의 존재에 의존한다.
예를 들어, Person 엔티티 없이, PersonInfo 엔티티는 어떤 의미가 없다.
Person 엔티티를 지울 때, PersonInfo 엔티티 역시 지워져야한다.
캐스케이딩은 이것을 위한 방법이다. 특정 엔티티에 어떤 작업을할 때, 같은 작업이 관련 엔티티에도 적용된다.
JPA Cascade Type
모든 JPA 구현체들의 캐스케이드 연산자는 javax.persistence.CascadeType 이넘으로 표현된다. 항목은 다음과 같다.
- ALL
- PERSIST
- MERGE
- REMOVE
- REFRESH
- DETACH
Hibernate Cascade Type
Hibernate는 세가지 캐스캐이드 타입을 추가로 지원한다.
이 특정 Hibernate 캐스캐이드 타입은 org.hibernate.annotations.CascadeType 세어 사용가능하다.
- REPLICATE
- SAVE_UPDATE
- LOCK
Difference Between the Cascade Types
1. CascadeType.ALL
부모에서 자식 엔티티의 모든 연산을 전파한다.
> OneToMany 연관관계에서 캐스캐이드 타입을 애노테이션으로 표현할 수 있다.
2. CascadeType.PERSIST
이 Persist 연산자는 비영속상태(transient) 인스턴스는 영속상태로 만든다.
PERSIST 캐스캐이딩 타입은 부모에서 자식 엔티티의 영속 연산자를 전파합니다.
3. CascadeType.MERGE
이 Merge 연산자는 주어진 오브젝트의 상태를 같은 Id를 같는 영속상태 오브젝트에게 복사 전달한다.
MERGE 캐스캐이딩 타입은 부모에서 자식 엔티티의 머지 연산자를 전파합니다.
entityManager.clear()로 detech 상태로 만든다.
비영속 상태의 부모, 자식entity들을 변경한 후, 부모만 entityManager.merge(parent) 하면, 비영속 상태에서 변경사항이 적용되어 부모와 자식 둘다 update쿼리가 날라간다,
4. CascadeType.REMOVE
이 Remove 연산자는 데이터베이스와 영속성 컨텍스트에서 해당 행을 제거한다.
REMOVE 캐스캐이딩 타입은 부모에서 자식 엔티티의 머지 연산자를 전파합니다. 하이버네이트에서는 이와 비슷한 CascadeType.DELETE가 있다.
5. CascadeType.DETACH
이 Detach 연산자는 엔터티를 영속성 컨텍스트에서 제거한다.
DETACH 캐스캐이딩 타입은 자식 엔티티도 영속성 컨텍스트에서 제거된다.
6. CascadeType.LOCK
이 Lock 연산자는 이름으로 낚이지말고, 해당 엔터티와 자식 엔터티를 영속성 컨텍스트에 다시 담는다.
7. CascadeType.REFRESH
이 Refrash 연산자는 데이터베이스로부터 주어진 엔터티를 다시 읽어온다.
만약, 데이터베이스에서 영속상태 이후에 인스턴스를 변경하게되면, 우리는 나중에 변경을 취소해야된다.
REFRASH연산자를 사용하면 데이터베이스에서 부모 엔티티가 리프레쉬되면 자식 엔티티또한 다시 로도된다.
8. CascadeType.REPLICATE
이 Replicate 연산자는 하나 이상의 데이터 소스를 사용하고, 데이터 동기화를 원할때 사용한다.
Replicate연산자를 사용해, 동기화 연산자가 부모 엔티티에서 동작할때, 자식 엔티티에게도 전파된다.
9. CascadeType.SAVE_UPDATE
이 Save_Update 는 연관된 자식 엔티티에 같은 연산자가 전파된다.
이는 하이버 네이트 구현체의 save, update 그리고 saveOrUpdate같은 연산자에 사용된다.
참고 사이트
- https://www.baeldung.com/jpa-cascade-types
'학자형 개발' 카테고리의 다른 글
이벤트 스토밍과 DDD(Domain Driven Design) (0) | 2021.06.02 |
---|---|
Mocks Aren't Stubs! Mock과 Stub 에대하여 (0) | 2021.05.27 |
DDD와 Aggregate (0) | 2021.05.24 |
DDD 지향 마이크로 서비스 디자인 (0) | 2021.05.24 |
Cloud Native Archtecure 를 위해 고려햐야될 항목 (0) | 2021.04.11 |