복합 값 타입
을 의미임베디드 타입(embeddedType)
이라 한다.@Embeddeble
: 값 타입을 정의하는 곳에 표시
@Embedded
: 값 타입을 사용하는 곳에 표시
기본 생성자 필수
Member 엔티티는 이름, 근무일(근무 시작일, 근무 종료일), 주소(도시, 번지, 우편번호) 필드를 가진다.
@Entity
public class Member{
@Id @GeneratedValue
@Column(name="MEMBER_ID")
private Long id;
@Column(name = "USERNAME")
private String username;
//기간
private LocalDateTime startDate;
private LocalDateTime endDate;
//주소
private String city;
private String street;
private String zipcode;
}
//값타입 정의
@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;
}
...
}
Period 클래스
를 생성Address 클래스
를 생성@Embeddable
을 사용하여 임베디드 타입임을 정의@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
를 사용하여 Period, Address 클래스를 이용하여 필드를 만들었다.Member member = new Member();
member.setUsername("hello");
member.setHomeAddress(new Address("city","street","1000"));
member.setWorkPeriod(new Period());
em.persist(member);
@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
private Address oldAddress; //에러! repeated column in mapping for entity.
...
}
@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"))
})