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).
Sie drücken hier zwei Konzepte aus:
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:
Employee
ist) Das resultierende Employee
könnte wie folgt aussehen:
Und dies würde zu den folgenden Tabellen führen:
%Vor%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.
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,
Tags und Links java hibernate orm single-table-inheritance