cascade 의 종류(실무에서 많이 사용)
옵션
cascadeType.ALL : 모두 적용
cascadeType.Persist : 영속
cascadeType.remove : 삭제
cascade의 사용 타이밍
1.하나의 부모가 여러 자식을 관리할때
(게시판 , 첨부파일 등)
-자식을 여러 객체가 관리할경우에는 사용해선 안된다.
-자식의 소유자가 하나뿐일때만 사용
자식과 부모의 라이프 사이클이 거의 유사할때 , 단일 소유자일 경우에만 사용한다.
고아 객체 : 부모 엔티티와 연관관계가 끊어진 자식엔티티
고아 객체 삭제 : 부모 엔티티와 연관관계가 끊어진 자식엔티티를 자동으로 삭제
고아 객체 삭제 옵션 : orpranRemoval = true.
orpranRemoval = true. 해당 옵션을 주게되면
Parent parent1 = em.find((parent.class , id);
parent1.getChildren().remove(0);
//자식 엔티티를 컬렉션에서 제거
//부모객체와 자식객체가 연결이 끊어질때
Delete from child where Id = ? // 자동으로 고아객체를 지우는 SQL이 나가게 된다.
부모에게서 remove 되면 영속성 컨테이너에서도 버려지게 된다, (준영속이 된다)
고아객체 주의
-참조가 제거된 엔티티는 다른곳에서 참조하지 않는 고아객체를 보고 삭제하는 기능
-참조하는 곳이 하나일때 사용해야한다.
-특정 엔티티가 개인 소유일때 사용
-@OneToOne , @OneToMany에서만 사용가능
참고 - 개념적으로 부모를 제거하면 자식은 고아가 된다.
따라서 고아객체 제거기능을 활성화 하면
부모를 제거할때 자식도 함께 제거된다.
이것은 cascadeType.remove처럼 동작한다.
cascadeTypeAll 이면 부모를 삭제시 자식들도 같이 삭제된다.
영속성 전이 + 고아객체 생명주기
cascadeTypeAll + orpranRemoval = true
스스로 생명주기를 관리하는 엔티티은 em.persist()로 영속화
em.remove로 제거
두 옵션을 모두 활성화 하면 , 부모엔티티를 통해서 자식의 생명주기를 관리할 수 있음.
도메인 주로설계(DDD) 의 AggregateRoot 개념을 구현할 때 유용
부모만 persist하거나 remove하거나
자식은 delete할 수 있는데 중요한것은 child는 생명주기는 부모 Parent가 관리할수 있게된다.
'JPA' 카테고리의 다른 글
2월 3일 JPA 임베디드 클래스 실사용 (0) | 2023.02.03 |
---|---|
2월 3일 JPA 임베디드 타입class와 테이블을 매핑 (0) | 2023.02.03 |
2월 3일 JPA 임베디드 타입 (0) | 2023.02.03 |
2월 3일 JPA 값타입 (0) | 2023.02.03 |
2월 3일 JPA 실전예제 5.연관관계 관리 (0) | 2023.02.03 |