부모 엔티티의 영속성 상태 변화를 자식 엔티티에게 그대로 전파하는 기능
@OneToMany(cascade=CascadeType.XXX)와 같이 사용
기본값은 '사용 안함' (아무 전이도 없음)
CascadeType.ALL: 모든 옵션을 적용 (PERSIST+REMOVE+MERGE+REFRESH+DETACH)CascadeType.PERSIST: 부모 저장 시 자식도 저장Parent parent = new Parent();
parent.addChild(new Child());
// PERSIST 옵션이 있다면,
// parentRepository.save(parent)만으로 parent와 child가 모두 INSERT 됩니다.
parentRepository.save(parent);
CascadeType.REMOVE: 부모 삭제 시 자식도 삭제Parent parent = parentRepository.findById(1L).get();
// REMOVE 옵션이 있다면, parentRepository.delete()만으로
// parent와 연관된 모든 children이 함께 DELETE 됩니다.
parentRepository.delete(parent);
CascadeType.MERGE: 준영속(detached) 상태의 부모 엔티티를 병합할 때 변경사항을 자식에게도 적용// 1. parent와 children을 조회 후 영속성 컨텍스트 종료 (준영속 상태가 됨)
Parent parent = parentRepository.findById(1L).get();
transaction.commit(); // 컨텍스트 종료
// 2. 준영속 상태에서 자식의 이름 변경
parent.getChildren().get(0).changeName("New Name");
// 3. 새로운 영속성 컨텍스트에서 parent를 merge
// MERGE 옵션이 있다면, 변경된 child의 상태까지 함께 DB에 UPDATE 됩니다.
entityManager.merge(parent);
CascadeType.REFRESH: 부모 상태를 다시 읽어올 때, 자식 엔티티도 함께 다시 읽어옴Parent parent = parentRepository.findById(1L).get();
// 이 시점 이후 DB에서 직접 자식의 데이터가 변경되었다고 가정
// REFRESH 옵션이 있다면, parent를 refresh할 때
// children 컬렉션의 데이터도 DB의 최신 상태로 갱신됩니다.
entityManager.refresh(parent);
CascadeType.DETACH: 부모가 준영속 상태가 될 때, 자식도 함께 준영속 상태로 만듦
@OneToMany를 잘 사용하지 않으니, Cascade 역시 잘 사용하지 않는다.
아예 안쓰거나, 쓴다면CascadeType.ALL을 사용한다.
부모와 자식의 연관관계 자체가 끊어지는 상황
@OneToMany(orphanRemoval = true/false)와 같이 사용
기본값은false
DELETE 쿼리 실행DELETECascadeType.REMOVE와 결과적으로 동일)