현재 개발하고 있는 프로젝트에서 사용하는 테이블들 간의 관계가 매우 복잡하다.

할 때 마다 까먹고, 정확히 사용하고 있는 건지 확신이 서지 않아 이번 기회에 다시 정리하기로 하였다.

 

먼저,

  • Cascade
    • @OneToMany, @ManyToOne 옵션 값 (parent-child 관계 일 때)
    • Entity의 상태가 변화했을 때 관계가 있는 Entity에도 상태 변화를 전파시키는 옵션 
    • Entity의 상태란?
      • Transient : 객체에 관해 아무것도 모르는 상태
      • persistent : 저장하여 JPA가 관리하는 상태로, 필요한 시점에 DB에 적용
      • detached : JPA가 관리하지 않는 상태 
      • removed : JPA가 관리는 하나, commit 시점에만 삭제
    • Type
      • type 명시하지 않을 시 모든 연관 관계 무시 
      • save-update 
        • save(), update() 하면 연관 관계 탐색해서 새로 생성된 비영속 인스턴스 저장, 준영속 인스턴스에서 발생한 변경사항 영속화
      • persist
        • 연관 관계에 있는 비영속 인스턴스를 영속화 하여, 해당 인스턴스를 호출 할때 연쇄 작용 일으킴
      • merge
        • 연관 관계에 있는 비영속 인스턴스를 영속 인스턴스로 병합
      • delete
        • delete(), remove()시 연관 관계에 있는 영속 인스턴스 삭제
      • remove
        • delete(), remove()시 연관 관계에 있는 영속 인스턴스 연쇄 삭제
      • lock
      • replicate
      • evict
      • refresh
      • all
        • 위 목록에 있는 모든 연쇄 옵션을 포함해 활성화 한다. 

 

 

수많은 @OneToMany의 향연 속에서 Parent가 삭제될 때 Child를 어떻게 할 것인가를 고민하다

Parent가 삭제되면 Child도 삭제하기로 결정. 그리고 구현방법을 찾아보다 아래 두가지 방법을 찾게 되었는데 

똑같아 보이는데 왜 다르지? 궁금증이 생김, 구글에 검색해서 내가 원하는 명확한 차이점을 찾았고(힘들었음..)

아래에 정리해 보았다. 

 

  • orphanRemoval=true  vs  CascadeType.REMOVE
    • Parent가 삭제 되었을 때 Child도 함께 삭제시키는 역할을 수행하는 점에선 동일
    • 다른점은,
      • 관계를 끊는 것에 대한 응답!
      • 만약 Parent의 Child 값을 null을 주었다고 가정
        • orphanRemoval=true는 관계가 끊어진 child를 자동으로 제거한다. 
        • CascadeType.REMOVE는 관계가 끊어진 child를 자동 제거하지 않는다.
          • 관계가 끊어졌다는 것을 제거로 보지 않기 때문에 

https://www.objectdb.com/java/jpa/persistence/delete#Orphan_Removal_

 

Using JPA to remove (delete) Java entity objects from the database

Existing entity objects can be deleted from the database either explicitly by invoking the removeremove(entity)EntityManager's methodRemove the entity instance.See JavaDoc Reference Page... method or implicitly as a result of a cascade operation. This page

www.objectdb.com

 

+ Recent posts