-> 새로운 값 타입을 직접 정의할 수 있으며, 직접 정의한 임베디드 타입도 int
, String
처럼 값 타입이다. 주로 기본 값 타입을 모아서 만들기 때문에 복합 값 타입이라고도 불린다. 엔티티가 아닌 값 타입으로, 엔티티 타입의 값일 뿐이다.
JPA에서 정의해서 사용해야 한다.
임베디드 타입 사용 방법
@Embeddable
: 값 타입을 정의하는 곳에 표시한다.@Embedded
: 값 타입을 사용하는 곳에 표시한다.장점
임베디드 타입은 엔티티의 값일 뿐이여서 값이 속한 엔티티의 테이블에 매핑한다.
임베디드 타입은 값 타입을 포함하거나 엔티티를 참조할 수 있다.
//임베디드 사용 전
@Entity
public class Member{
private Long id;
private String name;
//주소 관련
private String city;
private String street;
private String state;
}
//임베디드 사용 후
@Entity
public class Member{
private Long id;
private String name;
@Embedded
Address address; //임베디드 타입 포함
}
@Embeddable
public class Address{
String city;
String street;
String state;
@Embedded
Zipcode zipcode; //임베디드 타입 포함
}
@Embeddable
public class Zipcode{
String zip;
String plusFour;
}
회원 엔티티에는 이름, 주소, 주문 도시, 주문 번지, 주문 우편번호를 가진다.
하지만 이것은 정보를 풀어서 설명한 것이기때문에 정확히 말하자면회원엔티티에는 이름, 주문을 가진다.
라고 말해야한다.
같은 임베디드 타입 클래스를 두 번 사용할 경우 @AttributeOverrides와 @AttributeOverride 어노테이션을 사용해서 각 필드에 매핑되는 컬럼명을 지정해줘야 한다.
@Embeddable
public class Address{
String city;
String street;
String zipcode;
}
@Entity
public class Member{
private Long id;
private String name;
@Embedded
Address userAddress; //주소
@Embedded
Address friendAddress; // 주소
}
@Entity
public class Member{
private Long id;
private String name;
@Embedded
Address userAddress; //주소
@Embedded
@AttributeOverrides({ // 새로운 컬럼에 저장 (컬럼명 속성 재정의)
@AttributeOverride(name="city", column=@Column(name = "FRIEND_CITY"),
@AttributeOverride(name="street", column=@Column(name = "FRIEND_STREET"),
@AttributeOverride(name="zipcode", column=@Column(name = "FRIEND_ZIPCODE")})
Address friendAddress; // 주소
}