현재 개발하고 있는 프로젝트에서 사용하는 테이블들 간의 관계가 매우 복잡하다.
할 때 마다 까먹고, 정확히 사용하고 있는 건지 확신이 서지 않아 이번 기회에 다시 정리하기로 하였다.
먼저,
- 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_
'JPA & DB' 카테고리의 다른 글
Hikari Option 정리 (0) | 2022.03.25 |
---|---|
JPA 트랜잭션 격리수준 (Isolation Level) 과 락 (Lock) (0) | 2022.01.10 |
JPA Persistence Context 그리고.. Flush / Lazy Loading / N+1 Problem (0) | 2021.11.15 |
[JPA] 복합키에서 equals () 및 hashCode () 구현하는 이유 (0) | 2020.03.06 |
[JPA] OneToMany & multi OneToOne (0) | 2020.03.06 |