2009-12-10 14 views

Respuesta

10

Específicamente, ¿qué estás teniendo problemas con ? jerarquía de clases de mapeo via joined subclasses es bastante sencillo:

@Entity 
@Inheritance(strategy=InheritanceType.JOINED) 
public class A implements Serializable { ... } 

@Entity 
public class B extends A { ... } 

@Entity 
@PrimaryKeyJoinColumn(name="A_ID") 
public class C extends A { ... } 

@Entity 
@PrimaryKeyJoinColumn(name="B_ID") 
public class D extends B { ... } 

actualización (basado en el comentario de Michal).

En caso de que desee utilizar discriminadores (y usted debe tener una buena razón para hacerlo), es posible hacerlo mediante la mezcla de table-per-class-hierarchy strategy con secondary tables:

@Entity 
@Table(name="A_table") 
@Inheritance(strategy=InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn(name="entity_type") 
@DiscriminatorValue("A") 
public class A implements Serializable { ... } 

@Entity 
@SecondaryTable(name="B_table") 
public class B extends A { ... } 

@Entity 
@SecondaryTable(name="C_table", pkJoinColumns={ 
    @PrimaryKeyJoinColumn(name="A_ID", referencedColumnName="ID") 
)) 
public class C extends A { ... } 

@Entity 
@SecondaryTable(name="D_table", pkJoinColumns={ 
    @PrimaryKeyJoinColumn(name="B_ID", referencedColumnName="ID") 
)) 
public class D extends B { ... } 

La desventaja de este enfoque es que usted tendrá que especificar explícitamente la tabla para cada propiedad mapeada:

public class D extends B { 
    @Column(table="D_table") 
    private String someProperty; 

    ... 
} 
+0

Creo que esta no era la pregunta. Quiere usar columnas discriminatorias por lo que yo entendí. Esa es la razón por la que compre mi respuesta, tu reputación aquí es mucho más alta, así que muy bien podría estar equivocado :-) –

+0

@Michal - OP no menciona el discriminador en ningún lado. La pregunta a la que se vinculó dice que el discriminador se usa por razones históricas, pero no dice que quiera seguir utilizándolo. En cualquier caso, si OP quiere usar discriminadores, es muy posible: he actualizado mi respuesta para mostrar un ejemplo. – ChssPly76

+0

Resulta que estaba en el camino correcto pero tenía un problema más básico en mi hbm que hizo que mis anotaciones no se recogieran. Gracias por la respuesta clara de todos modos. ¡Aclamaciones! –

0

Inheritance between @Entity annotated classes se recoge de forma automática. Entonces, si la clase A se anota y la clase B también se anota con @Entity y se extiende A, y C se extiende B y también se anota @Entity, todo se recogerá.

No he utilizado unido subclases combinados con valores discriminadores, pero estoy seguro de que será muy similar a lo que se hace en XML (utilizando @DiscriminatorColumn y @DiscriminatorValue)

+0

Esto es incorrecto. Hay una gran diferencia entre el polimorfismo implícito al que se refiere y en realidad mapear la jerarquía de clases. – ChssPly76

+0

¿Puede profundizar en esta afirmación? No sabía que estaba aludiendo al polimorfismo implícito, no era mi intención. Quería describir una jerarquía A <- B <- C ... –

+0

"La herencia entre clases anotadas @Entity se recoge automáticamente", eso es polimorfismo implícito. Para mapear la jerarquía de clase real, debe anotar explícitamente la clase raíz con '@ Inheritance' (además de usar anotaciones adicionales según la estrategia elegida). – ChssPly76

0

Esto es exactamente lo que funcionaba bien para mí:

@Entity 
@Inheritance(strategy = InheritanceType.JOINED) 
@DiscriminatorColumn(name="LoanType",discriminatorType="String") 
@Table(name = "A") 
public class A implements Serializable{ 
} 

@Entity 
@Table(name= "B") 
@PrimaryKeyJoinColumn(name = "B_ID", referencedColumnName ="A_ID") 
public class B extends A{ 
} 


@Entity 
@Table(name= "C") 
@PrimaryKeyJoinColumn(name = "C_ID", referencedColumnName = "B_ID") 
public class C extends B{} 
Cuestiones relacionadas