엔티티 는 식별자가 있어서 엔티티의 값을 변경해도 식별자로 DB에 저장된 원본 데이터를 쉽게 찾아서 변경 할 수 있다.
반면 값 타입은 식별자라는 개념이 없고 단순한 값들의 모음이므로 값을 변경해버리면
DB에 저장된 원본 데이터를 찾기어렵다.
JPA 구현체들은 값 타입 컬렉션에 변경사항이 생기면 값 타입 컬렉션과 관련된 데이터를 모두 삭제하고,
다시 현재 값 타입 컬렉션에 있는 데이터를 저장한다.
실무에서는 값 타입 컬렉션에 매핑된 데이터가 많으면 값 타입 컬렉션 대신 일대다 관계를 고려해야 한다.
추가로 값 타입 컬렉션을 매핑하는 테이블은 모든 컬럼을 묶어서 기본키로 구성해야 한다.
따라서 DB 기본 키 제약조건으로 인해 컬럼에 null 을 입력할 수 없고 같은 값을 중복해서 넣을 수 없는 제약도 있다.
이러한 문제들은 값 타입 컬렉션 대신에 새로운 엔티티를 만들어서 일대다 관계로 설정하면 된다.
여기에 추가로 영속성 전이 + 고아 객체 제거 기능을 추가하면 값타입 컬렉션 처럼 사용할 수 있다.
public class AddressEntity {
@Id
@GeneratedValue
private Long id;
@Embedded
private Address address;
}
public class Member {
@OneToMnany(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "MEMBer_IOD")
private List<AddressEntity> addressHsitory = new ArrayList<>)();
}
정리
- 엔티티 타입 의 특징
- 식별자가 있다
엔티티 타입은 식별자가 있고 식별자로 구분할 수 있다.
- 생명주기가 있다.
생성, 영속화, 소멸하는 생명 주기가 있다.
- 공유할 수 있다.
참조 값을 공유한다. 이것을 공유 참조 라고 한다.
어떤 엔티티가 있으면 다른 엔티티에서 얼마든지 조회할 수 있다.
2. 값 타입의 특징
- 식별자가 없다.
- 생명주기를 엔티티에 의존한다.
- 공유하지 않는 것이 안전하다.
값을 복사해서 사용해야 한다.
오직 하나의 주인만이 관리해야 한다.
불변 객체로 만드는 것이 안전하다.
'Back-End > JPA' 카테고리의 다른 글
JPA) Spring OSIV (0) | 2022.03.14 |
---|---|
JPA) 과거 방식의 OSIV (0) | 2022.03.13 |
JPA) 객체지향 쿼리 (0) | 2022.03.12 |
JPA) 영속성 전이 (0) | 2022.03.12 |
JPA) Eager, Lazy 로딩 (0) | 2022.03.12 |