JPA의 값 타입은 Entity와 값 타입이 있다.
- Entity :
@Entity로 정의하며, 식별자로 추적 가능
- 값 타입 :
String처럼 단순히 값으로 사용 => 변경시 완전히 다른 값으로 대체됨(추적불가)equals()사용 (equals(),hashcode()필요할수도)
임베디드 타입#
@Embeddable,@Embedded
- 기본 값 타입입을 모아 만든 복합 값 타입
- 엔티티가 아닌 그냥 값임 => 엔티티에 생명주기를 의존 => 테이블은 변화없음
- 또다른 임베디드타입이나 Entity를 내부에 가질 수 있음
- 재사용이 가능하고, 응집도가 높아짐
- 객체와 테이블을 세밀하게 매핑 가능
@Embedded는 필요없지만 쓰는걸 권장
한 엔티티에서 같은 타입을 사용한다면, @AttributeOverride()사용 가능
불변객체#
- 임베디드 타입 같은 값 타입은, 여러곳에서 공유되면 위험함 (의도치 않은 변경)
- 인스턴스를 복사해서 사용해야 함
- 그러나, 코드 레벨에서 이를 막을 수 있는 방법이 없음 => 불변 객체 사용
- 아예 객체 타입을 수정할 수 없게 만듬 => - 생성자로만 값을 설정, 수정자 ❌
값 타입 컬랙션#
값 타입을 하나이상 저장할 때,@ElementCollection,@CollectionTable을 사용해 별도의 테이블 만듬
지연로딩
CASCDE + 고아 제거 가능
주의!! : 값 타입은 추적이 불가능하기 때문에, 변경시 모든 값을 모두다시저장
따라서, 실무시에는 일대다 관계를 만들고, CASCADE+ orphanRemoval을 사용
이런 경우에는, 1:N 연관관계의 주인이 1쪽이 될 수도 있음