DarthShader
Erfahrenes Mitglied
Hallo,
ich habe eine - wahrscheinlich recht simple - Hibernate Frage. Ich möchte gerne ein und dieselbe Klasse in einer Tabelle unterbringen, jedoch zwei Instanzen davon, die durch einen ENUM unterschieden werden.
Konkret würde so eine Klasse z.B. so aussehen:
Das "parent" property ist die Vaterklasse. In der Datenbank gibt es da eben einen Fremdschlüssel, der von "table_myclass" (Spalte "parent_id") auf einen Eintrag in einer anderen Tabelle verweist, der die "Parent" Objekte enthält:
Man sieht hier, dass die Klasse "Parent" zwei properties vom Typ "MyClass" hat. Diese Objekte werden durch das Enum "MyClass.MyClassType" unterschieden.
Das Persistieren eines solchen Konstrukts funktioniert, das Laden der Objekte aus der DB jedoch nicht. Denn Hibernate findet ja 2 Objekte, die eine Referenz auf das "Parent" Objekt haben und kann nicht entscheiden, welches zu laden ist.
Was ich nun suche ist ein Hibernate-Mechanismus, um zwei Objekte desselben Typs auf zwei verschiedene Properties (Parent.myClassFirst und Parent.myClassSecond) zu mappen, welche z.B. durch einen Enum und einer Identifier-Spalte in der Tabelle unterschieden werden. Die Tabelle für "MyClass" sieht ja so aus:
Die Spalte "myClassType" wird dann von Hibernate verwendet, ob das richtige property von "Parent" zu setzen. Diese Information muss ich Hibernate natürlich mitgeben, und ich stelle mir vielleicht sowas vor:
Das obige ist natürlich nur fiktional, aber macht denke ich klar, wonach ich suche.
Ich kenne bereits zwei Lösungsmöglichkeiten:
Beide Ansätze funktionieren zwar, finde ich aber eher unschön. Besser wäre es, wenn Hibernate da irgendeine direkte Unterstützung bietet.
Kennt jemand vielleicht solch eine Möglichkeit mit Hibernate (Annotations)?
Über Eure Hilfe würde ich mich sehr freuen
Vielen Dank!
ich habe eine - wahrscheinlich recht simple - Hibernate Frage. Ich möchte gerne ein und dieselbe Klasse in einer Tabelle unterbringen, jedoch zwei Instanzen davon, die durch einen ENUM unterschieden werden.
Konkret würde so eine Klasse z.B. so aussehen:
Java:
@Entity
@Table( name = "table_myclass" )
public class MyClass {
public enum MyClassType {
FIRST, SECOND
}
@Id
@GeneratedValue( strategy = GenerationType.IDENTITY )
private Integer id;
@ManyToOne( optional = true )
@JoinColumn( name = "parent_id" )
private Parent parent;
@Enumerated( EnumType.STRING )
private MyClassType myClassType;
}
Das "parent" property ist die Vaterklasse. In der Datenbank gibt es da eben einen Fremdschlüssel, der von "table_myclass" (Spalte "parent_id") auf einen Eintrag in einer anderen Tabelle verweist, der die "Parent" Objekte enthält:
Java:
@Entity
@Table( name = "table_parent" )
public class Parent {
@Id
@GeneratedValue( strategy = GenerationType.IDENTITY )
private Integer id;
@OneToOne( mappedBy = "parent" )
private MyClass myClassFirst;
@OneToOne( mappedBy = "parent" )
private MyClass myClassSecond;
}
Man sieht hier, dass die Klasse "Parent" zwei properties vom Typ "MyClass" hat. Diese Objekte werden durch das Enum "MyClass.MyClassType" unterschieden.
Das Persistieren eines solchen Konstrukts funktioniert, das Laden der Objekte aus der DB jedoch nicht. Denn Hibernate findet ja 2 Objekte, die eine Referenz auf das "Parent" Objekt haben und kann nicht entscheiden, welches zu laden ist.
Was ich nun suche ist ein Hibernate-Mechanismus, um zwei Objekte desselben Typs auf zwei verschiedene Properties (Parent.myClassFirst und Parent.myClassSecond) zu mappen, welche z.B. durch einen Enum und einer Identifier-Spalte in der Tabelle unterschieden werden. Die Tabelle für "MyClass" sieht ja so aus:
Code:
-- table_myclass
+-------------+
| id |
| parent_id |
| myClassType |
+-------------+
Die Spalte "myClassType" wird dann von Hibernate verwendet, ob das richtige property von "Parent" zu setzen. Diese Information muss ich Hibernate natürlich mitgeben, und ich stelle mir vielleicht sowas vor:
Java:
public class Parent {
// [...]
@OneToOne( mappedBy = "parent",
identifyColumn = "myClassType", identifiedBy = MyClassType.FIRST )
private MyClass myClassFirst;
@OneToOne( mappedBy = "parent",
identifyColumn = "myClassType", identifiedBy = MyClassType.FIRST )
private MyClass myClassSecond;
}
Das obige ist natürlich nur fiktional, aber macht denke ich klar, wonach ich suche.
Ich kenne bereits zwei Lösungsmöglichkeiten:
- Als property von "Parent" mache ich eine Liste und speichere die beiden Objekte darin. Um das richtige zu finden, muss ich die Geschäftslogik nutzen bzw. Logik in der Domain Model Klasse.
- Ich könnte Ableitung verwenden, dort gibt es die Möglichkeit eine Spalte zu definieren, die das richtige Objekt identifiziert.
Beide Ansätze funktionieren zwar, finde ich aber eher unschön. Besser wäre es, wenn Hibernate da irgendeine direkte Unterstützung bietet.
Kennt jemand vielleicht solch eine Möglichkeit mit Hibernate (Annotations)?
Über Eure Hilfe würde ich mich sehr freuen
Vielen Dank!