@Entity
public class Member{
@Id @GeneratedValue
private Long id;
private String name;
@Embedded
Period workPeriod;
@Embedded
Address homeAddress;
}
@Embeddable
public class Period{
}
@Embeddable
public class Address{
}
임베디드 타입을 포함한 모든 값 타입은 엔티티의 생명주기에 의존하므로 엔티티와 임베디드 타입의 관계를 UML로 표현하면 컴포지션 관계가 됨
UML에서 기본 타입처럼 단순히 표현
임베디드 타입은 기본 생성자가 필수임
임베디드 타입은 값 타입을 포함하거나 엔티티를 참조할 수 있음
@Embeddable
public class Address{
String street;
String city;
String state;
@Embedded Zipcode zipcode; // 임베디드 타입 포함
}}
@Embeddable
public class PhoneNumber{
String areaCode;
String localNumber;
@ManyToOne PhoneServiceProvider provider; // 엔티티 참조
}
@AttributeOverride : 속성 재정의
임베디드 타입에 정의한 매핑정보를 재정의하려면 엔티티에 @AttributeOverride를 사용하면 됨
@Entity
public class Member{
@Id @GeneratedValue
private Long id;
private String name;
@Embedded Address homeAddress;
@Embedded
@AttributeOverrides({
@AttributeOverride(name="city" column=@Column(name="COMPANY_CITY")),
@AttributeOverride(name="street" column=@Column(name="COMPANY_STREET")),
@AttributeOverride(name="zipcode" column=@Column(name="COMPANY_ZIPCODE"))
})
Address companyAddress;
값 타입 컬렉션
값 타입을 하나 이상 저장하려면 컬렉션에 보관하고 @ElementCollection, @CollectionTable 어노테이션을 사용하면 됨
@Entity
public class Member{
@Id @GeneratedValue
private Long id;
@Embedded
private Address homeAddress;
@ElementCollection
@CollectionTable(name="FAVORITE_FOODS",
joinColumns= @JoinColumn(name="MEMBER_ID"))
@Column(name="FOOD_NAME")
private Set<String> favoriteFoods = new HashSet<String>();
@ElementCollection
@CollectionTable(name="ADDRESS", joinColumns=@JoinColumn(name="MEMBER_ID"))
private List<Address> addressHistory = new ArrayList<>();
// ...
}
관계형 데이터베이스의 컬럼은 컬렉션을 포함할 수 없기에 별도의 테이블을 추가하고 @CollectionTable을 사용해서 추가한 테이블을 매핑 해야함