2009-12-01 3 views
3

오늘 나는 흥미로운 문제에 직면했다. 나는 SINGLE_TABLE 전략으로 Hibernate JPA를 사용하여 상속 계층 구조를 수행 해왔다. 나중에 TABLE_PER_CLASS 전략을 정의한 계층 구조에 수퍼 클래스를 추가했습니다. 결과적으로 전체 계층 구조가 TABLE_PER_CLASS으로 작동하는 것으로 나타났습니다. @Inheriatance javadoc :JPA 주석을 통해 클래스 계층 구조의 분기에서 상속 전략 변경

엔티티 클래스 계층 구조에 사용될 상속 전략을 정의합니다. 엔티티 클래스 계층 구조의 루트 인 엔티티 클래스에 지정됩니다.

동일한 상속 계층 구조

의 다른 가지들에 대해 다른 매핑 전략을 사용할 수 있습니다 그리고이 문장에서 면제에 계속 :

Hibernate docs 그러나 말한다. 이것은 XML 구성을 통해 수행됩니다.

마지막으로, 내 질문은 - 어노테이션을 통해 앞에서 설명한 xml 동작을 사용하고 EntityManager을 사용하는 방법 (아마도 최대 절전 속성)일까요?

+0

, 나는 이것이 JPA 스펙에 최대 절전 모드 확장이라고 생각 . – skaffman

+0

그건 확실합니다. 그 동작을 가능하게하는 몇 가지 최대 절전 모드 특정 속성이 없는지 궁금했습니다. – Bozho

답변

2

하이버 네이트 문서 a little further의 "상속"장을 읽으면 계층 당 테이블과 서브 클래스 당 전략을 혼합 한 예제가 실제로 테이블 에 던져 보조 테이블 -per 계층 구조 :

<class name="Payment" table="PAYMENT"> 
    <id name="id" type="long" column="PAYMENT_ID"> 
     <generator class="native"/> 
    </id> 
    <discriminator column="PAYMENT_TYPE" type="string"/> 
    <property name="amount" column="AMOUNT"/> 
    ... 
    <subclass name="CreditCardPayment" discriminator-value="CREDIT"> 
     <join table="CREDIT_PAYMENT"> 
      <property name="creditCardType" column="CCTYPE"/> 
      ... 
     </join> 
    </subclass> 
    <subclass name="CashPayment" discriminator-value="CASH"> 
     ... 
    </subclass> 
</class> 

당신은 @SecondaryTable annotation를 사용하여 동일한 작업을 수행 할 수 있습니다 나는 그렇게 생각하지 않습니다

@Entity 
@Inheritance(strategy=InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn(name="PAYMENT_TYPE") 
@DiscriminatorValue("PAYMENT") 
public class Payment { ... } 

@Entity 
@DiscriminatorValue("CREDIT") 
@SecondaryTable(name="CREDIT_PAYMENT", pkJoinColumns={ 
    @PrimaryKeyJoinColumn(name="payment_id", referencedColumnName="id") 
) 
public class CreditCardPayment extends Payment { ... } 

@Entity 
@DiscriminatorValue("CASH") 
public class CashPayment extends Payment { ... } 
+0

감사합니다. 그것은 매우 아름답 지 않지만, :) 나는 'dark-corner-case'와 같은 것이 아니기 때문에 이것에 대한 명백한 지원이 없다는 것에 놀랐다. – Bozho

관련 문제