2012-03-27 14 views
0

ich eine Struktur wie diese:MultiDiscriminator Spalt in Hibernate Vererbungshierarchie

abstrakte Klasse A
abstrakte Klasse B erstreckt A
abstrakte Klasse C erweitert B

Das ist meine eigentliche Abbildung ist:

@Entity 
@Inheritance(strategy=InheritanceType.SINGLE_TABLE) 
@Table(name = "TAB_A") 
@DiscriminatorColumn(name="DISCRIMINATOR_A", discriminatorType=DiscriminatorType.STRING) 
public abstract class A { 
} 


@Entity 
@DiscriminatorValue("VALUE") 
@SecondaryTable(name = "TAB_B", pkJoinColumns = {@PrimaryKeyJoinColumn(name="ID_A")}) 
@Inheritance(strategy=InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn(name="DISCRIMINATOR_B",discriminatorType=DiscriminatorType.STRING) 
public abstract class B extends A 
{ 
} 


@Entity 
@DiscriminatorValue("VALUEB") 
@Inheritance(strategy=InheritanceType.SINGLE_TABLE) 
public abstract class C extends B 
{ 
} 

Ich habe eine dicriminator Spalte zwischen A und B, die discriminatorA ist.
Ich habe eine Dicriminator-Spalte zwischen B und C, die discriminatorB ist.

Die Vererbung zwischen A und B funktioniert. Die Vererbung zwischen B und C funktioniert nicht. Ich las diesen Punkt:

11.1.10 DiscriminatorColumn Annotation

Für die SINGLE_TABLE Mapping-Strategie und in der Regel auch für die zusammengefügten Strategie wird die Persistenz-Provider eine Typdiskriminator Spalte. Die DiscriminatorColumn-Annotation wird verwendet, um die Diskriminatorspalte für die SINGLE_TABLE- und JOINED-Vererbungszuordnungsstrategien zu definieren.

Die Strategie und die Diskriminatorspalte werden nur im Stammverzeichnis einer Entitätsklassenhierarchie oder Subhierarchie angegeben, in der eine andere Vererbungsstrategie angewendet wird.

Hat jemand eine Idee, wie man dieses Mapping macht?

Danke.

+0

So ermöglicht JPA 1 Diskriminator pro Vererbungsbaum. – DataNucleus

Antwort

0

Remove this:

@DiscriminatorColumn(name="DISCRIMINATOR_B",discriminatorType=DiscriminatorType.STRING) 

Diskriminator Spalte Nachdem einmal pro Hierarchie ist genug. Alle Entitäten in dieser Hierarchie haben eine Zeile in TAB_A (definiert in Entität A). Dies ist auch ausreichend, wenn Sie eine verknüpfte Vererbungsstrategie (mehrere Tabellen) verwenden.

Andere Probleme mit Zuordnungen:

  • A die Wurzel Ihrer Entitätshierarchie ist, wird unter Verwendung von @Inheritance in B und C nicht erforderlich.
  • @DiscriminatorValue sollte auf konkrete Entitäten platziert werden, B und C sind abstrakt.