6

He siguiente jerarquía de herencia:Hibernar: ¿es posible asignar una herencia de varios niveles a una sola tabla?

Task 
    | 
SpecificTask 
    | 
VerySpecificTask 

Y me gustaría que persista que usign herencia de una sola mesa, así que anotada clases:

@Entity 
@Table(name="task") 
@Inheritance(strategy=InheritanceType.SINGLE_TABLE) 
public class Task 

@Entity 
public class SpecificTask extends Task 

@Entity 
public class VerySpecificTask extends SpecificTask 

Cuando trato de guardar un objeto de VerySpecificTask clase, me sale un error:

Unable to resolve entity name from Class [com.application.task.VerySpecificTask] 
expected instance/subclass of [com.application.task.Task] 

¿Qué es lo que me pasa? ¿Es posible asignar una herencia de varios niveles a una sola tabla?

EDIT: Aquí estaba un error cojo, lo he resuelto rápidamente, por lo que lo eliminé para no ensuciar esta pregunta.

+2

¿Ha configurado una columna de discriminador? ¿Cuál es el rastro de la pila de la excepción? –

+0

Uso appFuse y el disctiminator está configurado automágicamente. – mrzasa

+0

La herencia de varios niveles está permitida por JSR 303. ¿Estás seguro de que appFuse está aplicando anotaciones más allá del primer nivel en el árbol de herencia? – Perception

Respuesta

4

OK, he agregado y ahora funciona. código modificado: Se

@Entity 
@Table(name="task") 
@Inheritance(strategy=InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn(
     name="DTYPE", 
     discriminatorType=DiscriminatorType.STRING 
    ) 

@Entity 
public class SpecificTask extends Task 

@Entity 
public class VerySpecificTask extends SpecificTask 

(estoy añadiendo simplemente para proporcionar una respuesta aceptada - No me resolverlo sin los comentarios útiles a la pregunta.)

0

Pruebe la anotación @MappedSuperclass: columna discriminadora

@MappedSuperclass 
public class BaseEntity { 
    @Basic 
    @Temporal(TemporalType.TIMESTAMP) 
    public Date getLastUpdate() { ... } 
    public String getLastUpdater() { ... } 
    ... 
} 

@Entity 
public class Order extends BaseEntity { 
    @Id public Integer getId() { ... } 
    ... 
} 

In database, this hierarchy will be represented as an Order table having the id, lastUpdate and lastUpdater columns. The embedded superclass property mappings are copied into their entity subclasses. Remember that the embeddable superclass is not the root of the hierarchy though.

1

La respuesta aceptada es casi perfecta . Para que quede más claro, quiero agregar un @DiscriminatorValue a cada nivel de herencia.

@Entity 
@Table(name="task") 
@Inheritance(strategy=InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn(
     name="DTYPE", 
     discriminatorType=DiscriminatorType.STRING 
) 
public class Task 

--- 

@Entity 
@DiscriminatorValue(value="DS") 
public class SpecificTask extends Task 

--- 

@Entity 
@DiscriminatorValue(value="DV") 
public class VerySpecificTask extends SpecificTask 

Y la mesa materiliazed parece

--------------- 
Table: task 
--------------- 
|...|DTYPE|...| 
--------------- 
|...|DS |...| 
|...|DV |...| 
|...|DS |...| 
... 
Cuestiones relacionadas