-
Notifications
You must be signed in to change notification settings - Fork 0
Spring JPA OneToMany
- 1:N관계를 맺을 때 사용
- 다음과 같은 옵션이 있음
- targetEntity
- 관계를 맺기 위한 Entity Class를 정의함
- cascade
- 현 Entity를 변경할 때 관계를 맺은 Entity의 변경 전략을 결정하는데, 다음과 같은 Enum 타입이 존재
- ALL - 모든 Cascade 적용
- PERSIST - 엔티티를 생성하고, 연관 엔티티를 추가하였을 때
persist()
를 수행하면 연관 엔티티도 함께persist()
가 수행됨. 만약 연관 엔티티가 DB에 등록된 키값을 가지고 있다면detached entity passed to persist Exception
이 발생한다. - MERGE - 트랜잭션이 종료되고
detach
상태에서 연관 엔티티를 추가하거나 변경된 이후에 부모 엔티티가merge()
를 수행하게 되면 변경사항이 적용된다. (연관 엔티티의 추가 및 수정 모두 반영됨) - REMOVE - 삭제 시 연관된 엔티티도 같이 삭제됨
- REFRESH - 엔티티를 새로 고칠 때, 이 필드에 보유 된 엔티티도 새로 고칩니다.
- DETACH - 부모 엔티티가
detach()
를 수행하게 되면, 연관된 엔티티도detach
상태가 되어 변경사항이 반영되지 않는다.
- 현 Entity를 변경할 때 관계를 맺은 Entity의 변경 전략을 결정하는데, 다음과 같은 Enum 타입이 존재
- fetch
- 관계 Entity의 데이터 읽기 전략을 결정하는데, 다음과 같은 Enum 타입이 존재. 따로 설정하지 않으면 EAGER로 설정됨
- EAGER - 관계된 Entity의 데이터를 모두 함께 읽어옴 (Default)
- LAZY - 관계된 Entity의 데이터를 요청할 때 읽어옴
- 관계 Entity의 데이터 읽기 전략을 결정하는데, 다음과 같은 Enum 타입이 존재. 따로 설정하지 않으면 EAGER로 설정됨
- mappedBy
- 양방향 관계 설정시 관계의 주체가 되는 쪽에서 정의합니다.
- 사람과 휴대폰의 관계에서는 사람이 되겠죵? ㅎ
- orphanRemoval
- 관계 Entity에서 변경이 일어난 경우 DB 변경을 같이 할지 결정합니다. cascade와 다른것은 cascade는 JPA 레이어 수준이고 이것은 DB레이어에서 처리합니다.
- targetEntity
- 예시
- 유저와 유저의 메일 카테고리와 같은 곳에서 활용됨
- 또 다른 예시로는 한 사람은 여러 대의 휴대폰을 가질 수 있는 상황을 생각해보면 될 듯함
- orphanRemoval vs Cascade.REMOVE
@Entity
class Employee {
:
@OneToOne(cascade=CascadeType.REMOVE)
private Address address;
:
}
@Entity
class Employee {
:
@OneToOne(orphanRemoval=true)
private Address address;
:
}
If orphanRemoval=true is specified the disconnected Address instance is automatically removed. This is useful for cleaning up dependent objects (e.g. Address) that should not exist without a reference from an owner object (e.g. Employee).
orphanRemoval=true
의 경우에는 연결이 끊어진 Address instance는 자동적으로 삭제됨. 이는 부모 없는 고아(orphan)상태의 의존 객체를 정리하는데 유용하다고 함
If only cascade=CascadeType.REMOVE is specified no automatic action is taken since disconnecting a relationship is not a remove operation.
cascade=CascadeType.REMOVE
의 경우에는 연결이 끊어져도 고아(orphan)상태의 객체는 삭제되지 않음
추가 설명
자식 엔티티의 변경이 있다면 변경된 자식을 먼저 insert 하고 기존의 자식을 NULL로 update 한다. 그리고 orphanRemoval = true
로 하면 기존 NULL
처리된 자식을 DELETE 한다. PK
(JoinColumn)값이 NULL
로 변한 자식은 고아(orphan)객체라고 하여 연결된 점이 없는 객체이다. orphanRemoval
옵션은 바로 이 고아(orphan)객체를 삭제해주는 역할을 한다.