2009-05-27 12 views
7

Ho un oggetto con un campo che può essere un numero di tipi di oggetto. Questo oggetto è codificato in una singola tabella con una colonna discriminante per i sottotipi del campo. Ognuno di questi sottotipi ha i propri campi associati a una colonna nella tabella degli oggetti padre. Non riesco a modellare questo in letargo. Il codice qui sotto restituirà null per getSubfield() indipendentemente dai dati del sottotipo nella tabella.Ereditarietà embeddable Hibernate

Schema

 
    id type whosit whatsit 
+----+------+--------+---------+ 
| 1 | "A" | "test" | null | 
| 2 | "B" | null | "test" | 
+----+------+--------+---------+ 

Domain Objects

@Entity 
public class Parent { 
    protected @Id @GeneratedValue int id; 
    protected Subfield subfield; 

    public Subfield getSubfield() {return subfield;} 
} 


@Embeddable 
@Inheritance(strategy=InheritanceType.SINGLE_TABLE) 
@DiscriminatorColumn(name="type", discriminatorType=DiscriminatorType.STRING) 
public abstract class Subfield {} 


@DiscriminatorValue("A") 
public class TypeA extends Subfield { 
    public String whosit; 
} 


@DiscriminatorValue("B") 
public class TypeB extends Subfield { 
    public String whatsit; 
} 

"SELECT P da padre p"

{id=1,subfield=null} 
{id=2,subfield=null} 

È possib le per ottenere ciò che voglio con questo modello di oggetti, o ho bisogno di essere un po 'più creativo (questo è un database legacy, cambiare lo schema non è preferito)

+1

Un collega al lavoro mi ha indirizzato a http://opensource.atlassian.com/projects/hibernate/browse/HHH-1910. Suppongo che non sia supportato = \ –

risposta

3

Ok non è possibile modificare facilmente lo schema, ma che ne dici di aggiungere un paio di visualizzazioni?

+1

Buona idea, purtroppo, è ancora una modifica alla struttura del database. Sto cercando di risolvere il problema con il codice, se non altro, sembra una cosa che l'ibernazione potrebbe fare e sono curioso di sapere cosa sto facendo male. –

+1

+1 al tuo commento e ricorda a SO che a volte, non possiamo "fare le cose per bene" e correggere schemi di schemi sbagliati. :-) – cbmeeks

5

Come indicato dal richiedente, l'ibernazione non supporta l'ereditarietà delle classi incorporabili (https://hibernate.atlassian.net/browse/HHH-1910).

In base al wiki Eclipse, JPA non specifica questo comportamento, ma EclipseLink lo supporta (http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Entities/Embeddable#Inheritance).

Il mio suggerimento è di distruggere la gerarchia delle classi interamente all'interno del sottocampo. Orribile, ma dovrebbe funzionare finché non si risolve.

1

So che questo è vecchio.

Un modo per aggirare questo è come specificato sopra. Crea una vista Dici che non vuoi cambiare lo schema. Quindi non farlo. Puoi creare un nuovo schema che mappa il vecchio schema e fa quello che vuoi. (Probabilmente dipende dal database)

Problemi correlati