2011-02-01 10 views
9

Ho due classi di sospensione: una classe base e una classe estesa con campi aggiuntivi. (. Questi campi sono mappati da altre tabelle)Mappatura di più classi a una tabella in sospensione, senza colonna DTYPE

Ad esempio, ho:

@Entity 
@Table(name="Book") 
public class A { 
    private String ID; 
    private String Name; 
    // ... 
} 

@Entity 
@Table(name="Book") 
public class B extends A { 
    public String node_ID; 
    // ... 
} 

public class Node { 
    public String ID; // maps to B.node_ID 
    // ... 
} 

Come faccio a mappare questo in Hibernate? The hibernate documentation indica tre tipi di configurazioni di ereditarietà: una tabella per classe, una tabella con una colonna di tipi e una tabella di join, nessuna delle quali si applica qui.

Il motivo per cui ho bisogno di fare questo è perché la classe A proviene da un framework generico riutilizzato su più progetti e la classe B (e il nodo) sono estensioni specifiche di un progetto - non saranno più utilizzate. In futuro, potrei avere forse una classe C con un house_ID o qualche altro campo.

Modifica: Se provo la configurazione pseudo-codice sopra (due entità mappate sulla stessa tabella), ricevo un errore che la colonna DTYPE non esiste. L'HQL ha un "dove DTYPE =" A "aggiunto

+0

Se queste classi sono mappati allo stesso tavolo, senza colonna discriminatore, come sarebbe Hibernate distinguere quale è quale? – axtavt

+0

@axtavt questo è il punto, ogni istanza di B è anche una A. – ashes999

risposta

10

Ciò è possibile mappando lo @DiscriminatorColumn e @DiscriminatorValue con gli stessi valori per entrambe le classi, questo può essere da qualsiasi colonna che si utilizza che ha gli stessi dati indipendentemente da quale tipo (non so se funziona con valori nulli)

le classi dovrebbero apparire in questo modo:.

@Entity 
@Table(name="Book") 
@Inheritance(strategy=InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn(name="published") 
@DiscriminatorValue(value="true") 
public class A { 
    private String ID; 
    private String Name; 
    // ... 
} 

@Entity 
@Table(name="Book") 
@DiscriminatorValue(value="true") 
public class B extends A { 
    public String node_ID; 
    // ... 
} 
Problemi correlati