6

Ho seguente gerarchia di ereditarietà:Hibernate: è possibile mappare l'ereditarietà multi-livello su una singola tabella?

Task 
    | 
SpecificTask 
    | 
VerySpecificTask 

E mi piacerebbe persistono usign single-ereditarietà delle tabelle, così ho annotato le classi:

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

@Entity 
public class SpecificTask extends Task 

@Entity 
public class VerySpecificTask extends SpecificTask 

Quando si tenta di salvare un oggetto di VerySpecificTask classe, ottengo un errore:

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

Cosa devo fare? È possibile mappare l'ereditarietà multi-livello su una singola tabella?

EDIT: Ecco un bug zoppo, ho risolto rapidamente, quindi l'ho eliminato per non rovinare questa domanda.

+2

Avete configurato una colonna discriminatore? Qual è la traccia dello stack dell'eccezione? –

+0

Uso appFuse e il disciminatore è impostato automaticamente. – mrzasa

+0

L'ereditarietà a livello multiplo è consentita da JSR 303. Sei sicuro che appFuse stia applicando le annotazioni oltre il primo livello nell'albero delle eredità? – Perception

risposta

4

OK, ho aggiunto e ora funziona. codice modificato:

@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 

(io sono l'aggiunta solo di fornire una risposta accettato - non vorrei risolverlo senza gli utili commenti alla domanda.)

0

provare il @MappedSuperclass annotazione: colonna discriminatore

@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 risposta accettata è quasi perfetto . Per rendere più chiaro voglio aggiungere un @DiscriminatorValue a ciascun livello di ereditarietà.

@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 

e il tavolo materiliazed sembra

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