2009-11-20 6 views
0

기존 데이터베이스에 대한 상속을 사용하여 JPA를 구현하려고합니다. JPA 상속 다중 DiscriminatorValues ​​

현재 DB 모델

은 다음 InstrumentType 및 스토리지 클래스간에 다 대일 관계가

Instrument 
* InstrumentID 
* Description 
* InstrumentTypeID 

InstrumentType 
* InstrumentTypeID 
* StorageClass 

Option 
* InstrumentID 
* (Option specific fields) 

Stock 
* InstrumentID 
* (Stock specific fields) 

. 즉, List Option과 OTC Option에는 모두 저장소 클래스 "Option"이 있습니다.

JPA 모델에서는 Discriminator 값이 InstrumentTypeID로 설정된 추상 클래스 Instrument가 있습니다.

문제는 옵션 서브 클래스가 모두 InstrumentTypeID 3, 5

JPA이 모델하는 가장 좋은 방법은 무엇을 할 수 있습니까?

답변

1

귀하의 질문은 약간 혼란 스럽기 때문에 제 해석이 잘못되었을 수 있습니다.

그러나 Option을 두 클래스로 나눠서 문제를 해결할 수있을 것으로 생각됩니다. Option은 두 개의 구체적인 하위 클래스 인 ListOption과 OTCOption이있는 추상 클래스를 만듭니다. 각 클래스에는 고유 한 판별 자 값 (3 또는 5)이 있습니다. 두 개의 하위 클래스에는 서로 다른 필드가 없을 수도 있지만이 경우 InstrumentTypeID를 모두 사용하여 Option을 의미하게합니다.

문제는 분명히 좋은 것은 아니지만 코드 구조에서 InstrumentType 테이블에있는 지식을 복제한다는 것입니다.

전적으로 데이터 중심으로 만들고 싶다면 Option과 Stock을 Instrument의 하위 클래스가 아니도록 변경해야한다고 생각합니다. 아마도 InstrumentDetails 인터페이스의 구현 일 수 있으며, 각 클래스는 자체적 인 엔티티가 될 것입니다. InstrumentType은 엔티티가 될 수도 있습니다. 편의상, 악기 자체에 대한 방법

@Entity 
public class InstrumentType { 

    private static final Map<String, Class<? extends InstrumentDetails>> STORAGE_CLASSES = new HashMap<String, Class<? extends InstrumentDetails>>(); 
    static { 
     STORAGE_CLASSES.put("Option", Option.class); 
     STORAGE_CLASSES.put("Stock", Stock.class); 
    } 

    public InstrumentDetails getDetails(Instrument inst) { 
     return getEntityManager().find(STORAGE_CLASSES.get(getStorageClass()), inst.getID()); 
    } 

    // NB implementation of getEntityManager() is left as an exercise to the reader 

} 

: 그리고 당신은 다음 InstrumentType에게 같은 일부 코드를 줄 수있는 다음

@Entity 
public class Instrument { 
    public InstrumentDetails getDetails() { 
     return getInstrumentType().getDetails(this); 
    } 
} 

을, 나는 세부 사항에 저장 클래스 문자열에서 매핑을 고정 배선 한 클래스를 사용하지만 구성 파일이나 인젝션을 통해 동적으로 가져올 수 있으므로 새 저장소 클래스를 쉽게 추가 할 수 있습니다.