2009-05-27 13 views
7

Ich habe ein Objekt mit einem Feld, das eine Anzahl von Objekttypen sein kann. Dieses Objekt ist in einer einzigen Tabelle mit einer Diskriminatorspalte für die Subtypen des Feldes codiert. Für jeden dieser Subtypen sind die Felder einer Spalte in der übergeordneten Objekttabelle zugeordnet. Ich kann das nicht im Winterschlaf modellieren. Der folgende Code gibt Null für getSubfield() zurück, unabhängig davon, welche Datentypen in der Tabelle enthalten sind.Hibernate Embeddable Inheritance

Schema

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

Domain Objekte

@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; 
} 

"p von den Eltern SELECT p"

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

Ist es possib le, um zu erreichen, was ich will mit diesem Objektmodell, oder muss ich ein bisschen kreativer (das ist eine ältere Datenbank, Änderung des Schemas ist nicht bevorzugt)

+1

Ein Kollege bei der Arbeit wies mich auf http://opensource.atlassian.com/projects/hibernate/browse/HHH-1910. Ich denke, es wird nicht unterstützt = \ –

Antwort

3

Ok Sie können nicht einfach das Schema ändern, aber Wie wäre es mit ein paar Ansichten?

+1

Gute Idee, leider ist es immer noch eine Modifikation der Datenbankstruktur. Ich versuche, dies mit Code zu lösen, wenn nicht anders, es scheint, als könnte etwas überwintern, und ich bin neugierig, was ich falsch mache. –

+1

+1 zu Ihrem Kommentar und daran erinnern, dass manchmal, wir können es nicht richtig machen und schlechte Schema-Designs beheben. :-) – cbmeeks

5

Wie vom Fragesteller angegeben, unterstützt Hibernate keine Vererbung von embeddable Klassen (https://hibernate.atlassian.net/browse/HHH-1910).

Laut dem Eclipse-Wiki gibt die JPA dieses Verhalten nicht an, aber EclipseLink unterstützt es (http://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Entities/Embeddable#Inheritance).

Mein Vorschlag ist, die Klassenhierarchie vollständig in Subfield zu zerschlagen. Schrecklich, aber sollte funktionieren, bis das gelöst ist.

1

Ich weiß, das ist alt.

Ein Weg ist wie oben beschrieben. Erstellen Sie eine Ansicht. Sie sagen, dass Sie das Schema nicht ändern möchten. Dann nicht. Sie können ein neues Schema erstellen, das das alte Schema abbildet und ausführt, was Sie wollen. (Möglicherweise abhängig von der Datenbank)