본문 바로가기
개발/Java

[JPA] Jakarta Spec(JSR 338) - (3)Embeddable Classes

by Mingvel 2023. 8. 27.

[이전글]

[JPA] Jakarta Spec(JSR 338) - (1)Entity, Field, Access Type

[JPA] Jakarta Spec(JSR 338) - (2)기본 키(PK) 및 Entity ID

 

Jakarta EE 로고

Embeddable Classes (`@Embeddable` annotated classes)

  • Embeddable 클래스는 @Embeddable 어노테이션을 명시해야 한다
  • @Embeddable 어노테이션을 명시한 클래스는 @Entity 어노테이션을 명시할 수 없다
  • Embeddable 클래스는 자체 식별성을 가지지 않는다
  • Embeddable 클래스는 보통 소속된 Entity의 property 중 일부로 존재한다
  • Embeddable 클래스는 Map의 Key와 Value로 사용될 수 있다
  • Embeddable 클래스는 내부에 Java 기본 타입을 포함한 다른 타입의 컬렉션을 속성으로 가질 수 있다
  • Embeddable 클래스 내부에서 특정 Entity나 Entity의 컬렉션에 대한 관계(Relation)를 포함할 수 있다
  • Embbedable 클래스가 EmbedfdedId 혹은 Map의 Key로 사용 되는 경우, 그러한 관계를 포함해서는 안 된다

Embbeddale 클래스 및 기본 타입에 대한 컬랙션

  • Entity 클래스는 Embeddable 클래스의 컬렉션 타입을 포함할 수 있다
  • 이는 @ElementCollection 어노테이션의 명시로 적용할 수 있다
  • @ElementCollection 어노테이션을 명시한 Embeddable 클래스(Collection) 는 내부에 또 다른 @ElementCollection 필드를 가져서는 안 된다
  • @ElementCollection 어노테이션을 명시한 Embeddable 클래스 내부에선 many-to-one , one-to-one 관계만 포함 가능하다
  • Embeddable Class는 이러한 Relation의 주인(Owner) 측에 있어야 하며, 관계는 외래 키(FK) 매핑에 의해 매핑되어야 한다

 

Embeddable 클래스 사용 예시

@Embeddable
public class ShippingInfo {

    private String address;
    private String zipCode;
}

@Entity
@Table(name = "D_ORDER")
public class Order {

    @EmbeddedId
    private OrderId orderId;

    @Embedded
    @AttributeOverrides({
            @AttributeOverride(name = "address", column = @Column(name = "address")),
            @AttributeOverride(name = "zipCode", column = @Column(name = "zipcode"))
    })
    private ShippingInfo shippingInfo;
}

 

Embeddable 클래스의 컬렉션 타입 사용  예시

@Embeddable
public class OrderLine {

    @Embedded
    @AttributeOverride(name = "productId", column = @Column(name = "product_id"))
    private ProductId productId;

    @Convert(converter = MoneyConverter.class)
    @Column(name = "price")
    private Money price;

    @Column(name = "amount")
    private int amount;
}

@Entity
@Table(name = "D_ORDER")
public class Order {

    @EmbeddedId
    private OrderId orderId;

    @ElementCollection(fetch = FetchType.EAGER)
    @CollectionTable(name = "D_ORDER_LINE", joinColumns = @JoinColumn(name = "order_id"))
    @OrderColumn(name = "order_line_idx")
    private List<OrderLine> orderLines;
}

 

반응형

댓글