Jpa @Embedded and @Embeddable

Dev.Hammy·2023년 7월 1일
0

JPA_Hibernate

목록 보기
9/14

Data Model Context

예시) 회사 기본 정보와 담당자 정보가 저장되는 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
}

여기서 담당자를 별도의 클래스로 추상화해야 하지만, 세부정보에 대한 별도의 테이블을 만들고 싶지 않다면 다음과 같은 방법을 사용할 수 있다.

@Embeddable

JPA @Embeddable 어노테이션은 다른 엔터티에 클래스가 포함된다는 것을 나타낸다.

예시) 담당자 세부 정보를 클래스에서 추상화 하기

@Embeddable
public class ContactPerson {

    private String firstName;
    private String lastName;
    private String phone;

    // standard getters, setters
}

@Embedded

다른 엔터티로 타입을 포함시켜야 할 때 @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 엔터티가 되었다.
그러나 이러한 필드들을 데이터베이스 열에 어떻게 맵핑할 것인가?

Attributes Override

@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;

0개의 댓글