본문 바로가기

JPA

2월 2일 JPA cascade 의 종류

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가 관리할수 있게된다.