Ruhezustand: Eltern / Kind-Beziehung in einer Einzeltabelle

8

Ich sehe kaum einen Zeiger auf das folgende Problem im Zusammenhang mit Hibernate. Dies bezieht sich auf das Implementieren der Vererbung unter Verwendung einer einzelnen Datenbanktabelle mit einem Eltern-Kind-Element Beziehung zu sich selbst. Zum Beispiel:

%Vor%

Hier kann die Spalte managerId null sein oder auf eine andere Zeile der Tabelle Employee zeigen. Die Geschäftsregel setzt voraus, dass der Mitarbeiter über alle seine Mitarbeiter informiert ist und dass er über seinen / ihren Vorgesetzten Bescheid weiß. Die Geschäftsregeln ermöglichen auch, dass Zeilen den Wert null managerId haben (der CEO der Organisation hat keinen Manager).

Wie können wir diese Beziehung in Hibernate abbilden, funktioniert die Standard-Viele-zu-Eins-Beziehung hier nicht? Vor allem, wenn ich meine Entitäten nicht nur als entsprechende Entity-Klasse "Employee" implementieren möchte, sondern mehrere Klassen wie "Manager", "Assistant Manager", "Engineer" usw., die jeweils von der Entity-Klasse "Employee" erben , eine Entität mit Attributen, die nicht wirklich für alle gelten, zum Beispiel "Manager" erhält Perks, andere nicht (die entsprechende Tabellenspalte würde natürlich null akzeptieren).

Beispielcode wäre wünschenswert (ich beabsichtige Hibernate 3 Annotationen zu verwenden).

    
dchucks 11.03.2010, 05:55
quelle

3 Antworten

9

Sie drücken hier zwei Konzepte aus:

  1. Vererbung und Sie möchten Ihre Vererbungshierarchie in einer einzigen Tabelle abbilden.
  2. eine Eltern / Kind-Beziehung.

Um 1. zu implementieren, müssen Sie Hibernates einzelne Tabelle pro Klasse verwenden Hierarchie Strategie:

%Vor%

Um 2. zu implementieren, müssen Sie zwei selbstverweisende Verknüpfungen in Employee hinzufügen:

  • viele Mitarbeiter haben keinen oder einen Manager (was auch ein Employee ist)
  • ein Mitarbeiter hat null oder viele Reporter (s)

Das resultierende Employee könnte wie folgt aussehen:

%Vor%

Und dies würde zu den folgenden Tabellen führen:

%Vor%     
Pascal Thivent 11.03.2010, 17:46
quelle
3

Vielen Dank Jungs. Ich habe meine Mitarbeitereinheit wie folgt erstellt:

%Vor%

Ich habe dann andere Entity-Klassen ohne Körper hinzugefügt, aber nur mit Diskriminator-Spalten, wie Manager, CEO und AsstManager. Ich entschied mich, Hibernate den Tisch für mich erstellen zu lassen. Folgendes ist das Hauptprogramm:

%Vor%

Der Code läuft gut, Hibernate erstellt selbst eine Spalte "MANAGER_EMPLOYEE_ID", wo er den FK speichert. Ich habe den JoinColumn-Namen angegeben, um ihn zu "MANAGER_ID" zu machen. Hibernate erstellt auch eine Tabelle EMPLOYEE_EMPLOYED, die Daten werden jedoch dort nicht gespeichert.

Die Methode getReportees () gibt eine Null zurück, während getManager () wie erwartet funktioniert.

    
dchucks 12.03.2010 14:51
quelle
1

Ich bin mir nicht sicher, ob Sie wirklich wollen, aber ich denke, Sie wollen eine Tabelle pro Klassenhierarchie

In diesem Fall wird jede Entity wie folgt nach einem DISCRIMINATOR_COLUMN sortiert %Vor%

Und seine Children werden entsprechend

gemappt %Vor%

Um zu testen, machen wir Folgendes:

%Vor%

Aber anstelle der Vererbung (die Sie viele NULL-Spalte sehen können, weil mehr als eine Entität die gleiche Tabelle teilen - wenn Sie die InheritanceType.SINGLE_TABLE-Strategie verwenden), wäre Ihr Modell besser wie folgt

%Vor%

Fühlen Sie sich frei, den besten Ansatz zu wählen, der Ihre Bedürfnisse erfüllt.

Grüße,

    
Arthur Ronald 11.03.2010 16:42
quelle