1. 영속성전이(CASCADE)
- 특정 엔티티를 속 상태로 만들 때 연관된 엔티티도 함께 속 상태로 만들도 싶을 때
- 예시: 부모 엔티티를 저장할 때 자식 엔티티도 함께 저장.
영속성 전이는 즉시로딩, 지연로딩, 연관관계 세팅과 전혀 관계가 없습니다. 특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속 상태로 만들고 싶을 때 사용합니다.
Child child1 = new Child();
Child child2 = new Child();
Parent parent = new Parent();
parent.addChild(child1);
parent.addChild(child2);
em.persist(parent);
em.persist(child1);
em.persist(child2);
persist를 위의 코드와 같이 3번을 호출해야 3개의 insert문이 DB에 나갑니다. 그런데 이게 상당히 귀찮은 작업입니다.
그래서 parent를 persist할때 child도 자동으로 persist도 됐으면 좋겠을 때 사용하는게 바로 CASCADE입니다.
Child child1 = new Child();
Child child2 = new Child();
Parent parent = new Parent();
parent.addChild(child1);
parent.addChild(child2);
em.persist(parent);
parent에 cascade=CascadeType.PERSIST를 걸고 다시 실행을 해보면 child도 persist 되는걸 확인 할 수 있습니다.
2. CASCADE의 종류
- ALL: 모두 적용
- PERSIST: 영속
- REMOVE: 삭제
- MERGE: 병합
- REFRESH: REFRESH
- DETACH: DETACH
여러가지가 있는데, 저장할 때만 쓸꺼면 PERSIST하면되고, 아니면 ALL 쓰시면됩니다. 라이프사이클 다 맞춰야하면 ALL, 위험하니까 저장할때만 라이프사이클 맞출꺼면 PERSIST를 사용합니다. 실무에서도 실제로 많이 사용합니다. 그렇다면 이걸 언제 사용해야할까요? @OneToMany이면 다 걸어야할까요?
하나의 부모가 자식을 관리하면 이게 의미가 있습니다. 게시판과 첨부파일 이런 경우에는 쓸 수 있습니다.
쓰면 안되는 케이스는 그 파일을 여러군데에서 관리함. 다른 entity에서도 관리하고 그러면 쓰면 안됩니다. 즉, 소유자가 하나일때 사용하면 됩니다.
- 단일 entity에 완전히 종속적일때.
- parent와 child의 라이프 사이클이 유사할때
예를들어 parent와 child가 연관관계를 맺고있고, member와 child가 연관관계가 있으면 사용하면 안됩니다.
REFERENCE
https://www.inflearn.com/course/ORM-JPA-Basic
'JPA' 카테고리의 다른 글
[JPA] 임베디드 타입(복합 값 타입) (0) | 2020.04.26 |
---|---|
[JPA] 고아객체 (0) | 2020.04.22 |
[JPA] 즉시로딩과 지연로딩 (0) | 2020.04.22 |
[JPA] 프록시 (0) | 2020.04.22 |
[JPA] @MappedSuperclass 애노테이션 (0) | 2020.04.19 |