예시) 회사 기본 정보와 담당자 정보가 저장되는 company 테이블 정의하기
public class Company {
private Integer id;
private String name;
private String address;
private String phone;
private String contactFirstName;
private String contactLastName;
private String contactPhone;
// standard getters, setters
}
여기서 담당자를 별도의 클래스로 추상화해야 하지만, 세부정보에 대한 별도의 테이블을 만들고 싶지 않다면 다음과 같은 방법을 사용할 수 있다.
JPA @Embeddable 어노테이션은 다른 엔터티에 클래스가 포함된다는 것을 나타낸다.
예시) 담당자 세부 정보를 클래스에서 추상화 하기
@Embeddable
public class ContactPerson {
private String firstName;
private String lastName;
private String phone;
// standard getters, setters
}
다른 엔터티로 타입을 포함시켜야 할 때 @Embedded 어노테이션을 사용한다
예시) 별개의 필드 대신 ContactPerson으로 변경
@Entity
public class Company {
@Id
@GeneratedValue
private Integer id;
private String name;
private String address;
private String phone;
@Embedded
private ContactPerson contactPerson;
// standard getters, setters
}
담당자 세부정보를 포함하고, 단일 데이터베이스 테이블과 맵핑되는 Company 엔터티가 되었다.
그러나 이러한 필드들을 데이터베이스 열에 어떻게 맵핑할 것인가?
@AttributeOverrides 및 @AttributeOverride를 사용하여 포함된 유형의 열 속성을 재정의할 수 있다.
@Embedded
@AttributeOverrides({
@AttributeOverride( name = "firstName", column = @Column(name = "contact_first_name")),
@AttributeOverride( name = "lastName", column = @Column(name = "contact_last_name")),
@AttributeOverride( name = "phone", column = @Column(name = "contact_phone"))
})
private ContactPerson contactPerson;