DDD

@SecondaryTable을 이용한 밸류 매핑 설정

Beekei 2021. 9. 14. 14:06
반응형

@SecondaryTable을 이용한 밸류 매핑

  • 한 테이블 내부에 컬럼을 다른 테이블에서 관리할 때가 있다. (밸류 컬렉션을 별도 테이블로 매핑)
  • 만약 자식 테이블에서 외부키를 부모 테이블과 같이 쓰는 경우가 있는데
  • 이때 @SecondaryTable과 @AttributeOverride를 이용해서 자식 테이블과 식별자를 매핑한다.
  • 자식 테이블은 식별자가 존재하지만 밸류로 속하고 엔티티라고 볼 수 없다.
  • 무조건 연관되어 두개의 테이블 모두 가져와야 할때(Inner Join)만 사용해야 한다.

예시

  • 상품에 상품 소개 내용과 재고 정보를 사용
  • ProductContents = 상품 소개 내용, ProductStock = 재고 정보
@Entity
@Table(name = "product")
@Where(clause = "del_date IS NULL")
@Builder
@ToString
@NoArgsConstructor
@AllArgsConstructor
@SecondaryTables ({
    @SecondaryTable(name = "product_contents", pkJoinColumns = @PrimaryKeyJoinColumn(name = "pd_code")),
    @SecondaryTable(name = "product_stock", pkJoinColumns = @PrimaryKeyJoinColumn(name = "pd_code"))
})
public class Product {
	
	@EmbeddedId
    private ProductCode code;
	
	@AttributeOverride(name = "contents", column = @Column(table = "product_contents", name = "pdc_contents", length = 500, nullable = false))
    @Embedded
    private ProductContents contents;

    @AttributeOverrides({
        @AttributeOverride(name = "count", column = @Column(table = "product_stock", name = "pds_count")),
        @AttributeOverride(name = "active", column = @Column(table = "product_stock", name = "pds_active", columnDefinition = "enum"))
    })
    @Embedded
    private ProductStock stock;
	
}
@Embeddable
@Getter
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class ProductContents {

    private String contents;

}

@Embeddable
@Getter
@ToString
@NoArgsConstructor
@AllArgsConstructor
public class ProductStock {

    private int count;

    @Enumerated(EnumType.STRING)
    private StockActiveType active;

}
반응형