(이번 예시에서는 workPeriod(startDate, endDate)는 생략)
@Entity
public class Member extends BaseEntity{
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "MEMBER_ID")
private Long id;
private String name;
@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;
@OneToMany(mappedBy = "memberId", cascade = CascadeType.PERSIST) // Order에서 외례키로 설정되어 있는 memberId 변수를 mappedBy로 설정
private List<Order> orderList = new ArrayList<>(); //new ArrayList<>()로 초기화 시켜주는 것이 JPA에서의 관례
}
@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;
}
}
예시에서보면, 주소와 연관된 Column들 city, street zipcode를 Adress는 클래스로 묶은 후, @Embeddable 애노테이션을 추가해 줍니다. 그리고, 엔티티에서 Adress변수를 생성 후, 해당 변수에 @Embedded 애노테이션을 추가해서 Adress의 변수들을 엔티티의 Column에 추가하겠다는 것을 알려줍니다.
만약에 집주소(homeAdress)와 회사 주소(workAdress)를 Column으로 추가하고 싶다면 @AttributeOverrides를 이용해서 중복되는 것을 막아줍니다.
집주소와 회사 주소 모두 필요한 정보들은 같기 때문에 Adress 클래스를 사용하는데, 같은 이름의 Column들이 중복 될수 없기 때문에 @AttributeOverrides를 이용해서 Column의 이름을 지정해 줍니다. DEFAULT는 변수명으로 저장됩니다.
장점:
1. 재사용
2. 높은 응집도
3. 해당 값 타입만 사용하는 의미 있는 메소드를 만들 수 있음
4. 임베디드 타입을 포함한 모든 값 타입은, 값 타입을 소유한 엔티티에 생명주기를 의존함