임베디드 타입(복합 값 타입)
- 새로운 값 타입을 직접 정의할 수 있음
- 주로 기본 값 타입을 모아서 만들기때문에 복합 값 타입이라고도 함
- @Embeddable : 값 타입을 정의하는 곳에 표시
- @Embedded : 값 타입을 사용하는 곳에 표시
- 기본 생성자 필수
import javax.persistence.Embeddable;
import java.time.LocalDateTime;
@Embeddable
public class Period {
//기간
private LocalDateTime startDate;
private LocalDateTime endDate;
public Period() {
}
public Period(LocalDateTime startDate, LocalDateTime endDate) {
this.startDate = startDate;
this.endDate = endDate;
}
...
}
@Embeddable
public class Address {
private String city;
private String street;
private String zipcode;
public Address() {
}
public Address(String city, String street, String zipcode) {
this.city = city;
this.street = street;
this.zipcode = zipcode;
}
...
}
@Entity
public class Member {
@Id @GeneratedValue
@Column(name = "MEMBER_ID")
private Long id;
@Column(name = "USERNAME")
private String userName;
//기간
@Embedded
private Period workPeriod;
//주소
@Embedded
private Address homeAddress;
...
}
장점
- 재사용성
- 높은 응집도
- 임베디드 타입을 포함한 모든 값 타입은 값 타입을 소유한 엔티티에 생명주기에 의존
- 예를 들어 회원을 삭제하면 이름, 나이 필드도 함께 삭제
테이블 매핑
- 임베디드 타입은 엔티티의 값일 뿐
- 임베디드 타입을 사용하기 전과 후에 매핑하는 테이블은 같음
- 단지 객체와 테이블을 아주 세밀하게 매핑하는 기능
한 엔티티에서 같은 값 타입 사용
- 컬럼명 중복 시 에러
- @AttributeOverrides
- @AttributeOverride
@Entity
public class Member {
@Id @GeneratedValue
@Column(name = "MEMBER_ID")
private Long id;
@Column(name = "USERNAME")
private String userName;
//기간
@Embedded
private Period workPeriod;
//주소
@Embedded
private Address homeAddress;
//회사 주소
@Embedded
@AttributeOverrides({
@AttributeOverride(name="city",column=@Column(name = "WORK_CITY")),
@AttributeOverride(name="street",column=@Column(name = "WORK_STREET")),
@AttributeOverride(name="zipcode",column=@Column(name = "WORK_ZIPCODE"))
})
private Address workAddress;
...
}
'Spring > JPA' 카테고리의 다른 글
페치조인 (0) | 2024.01.15 |
---|---|
값 타입 컬렉션 (0) | 2024.01.02 |
영속성 전이 (0) | 2023.12.29 |
즉시로딩, 지연로딩 (1) | 2023.12.23 |
프록시(Proxy) (0) | 2023.12.20 |