Hibernate: Eltern - /Kind-Beziehung in einem single-table
Ich kaum sehen keine Zeiger auf das folgende problem in Verbindung mit Hibernate. Dies bezieht sich auf die Umsetzung der Vererbung mit einer einzelnen Datenbank-Tabelle mit einer Eltern-Kind
Beziehung zu sich selbst. Zum Beispiel:
CREATE TABLE Employee (
empId BIGINT NOT NULL AUTO_INCREMENT,
empName VARCHAR(100) NOT NULL,
managerId BIGINT,
CONSTRAINT pk_employee PRIMARY KEY (empId)
)
Hier, die managerId Spalte null sein darf, oder kann auf eine andere Zeile der Mitarbeiter Tabelle. Business-Regel muss der Mitarbeiter wissen über alle seine reportees und für ihn zu wissen, über seine/Ihre manager. Die business-Regeln erlauben auch die Zeilen haben null managerId (CEO der organisation, die nicht mit einem manager).
Wie wir Karte diese Beziehung in Hibernate, standard viele-zu-eins-Beziehung hier nicht funktioniert? Vor allem, wenn ich Sie umsetzen wollen, meine Einheiten nicht nur als eine entsprechende "Mitarbeiter" Entity-Klasse, sondern mehrere Klassen, wie "Manager", "Assistant Manager", "Ingenieur" usw., jedes Erben von "Mitarbeiter" super-entity-Klasse, eine Entität mit Attributen, die eigentlich gar nicht für alle gelten, zum Beispiel "Manager", bekommt Vergünstigungen, andere nicht (die entsprechenden Tabellen-Spalte die null-Werte akzeptieren natürlich).
Beispiel-code wäre sehr hilfreich (ich beabsichtige zu verwenden, Hibernate 3 annotations).
- Dupe: stackoverflow.com/questions/1862457/...
- Ich würde schätzen, dass ein code-Beispiel, das verwendet Annotationen (auf Hibernate 3), das ist die Absicht. Würden Sie dem Zustimmen?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Du meinst die beiden Konzepte hier:
Zur Umsetzung 1., Sie müssen mithilfe von Hibernate ist einzelne Tabelle pro Klassenhierarchie Strategie:
Umsetzen 2., müssen Sie zwei self-referencing-Verbänden
Employee
:Employee
)Den daraus resultierenden
Employee
Mai sieht wie folgt aus:Und das Ergebnis wäre in den folgenden Tabellen:
Dank einer Tonne Jungs. Ich habe meine Mitarbeiter Entität wie folgt:
Ich dann Hinzugefügt, dass andere Entität-Klassen mit keine Körper, sondern nur Diskriminator Spalten Werte, wie Manager, Geschäftsführer und AsstManager. Ich wählte zu lassen, Hibernate erstellen der Tabelle für mich. Im folgenden ist der Haupt-Programm:
Code läuft wunderbar, Hibernate war die Schaffung einer Spalte "MANAGER_EMPLOYEE_ID" auf seine eigene, wo es speichert die FK. Ich habe angegeben das JoinColumn Namen zu machen, "MANAGER_ID". Hibernate auch eine Tabelle erstellt EMPLOYEE_EMPLOYED, jedoch sind die Daten nicht persistiert es.
Methode getReportees () - Methode eine null zurück, während getManager() funktioniert gut, wie erwartet.
Ich bin nicht sicher ob Sie das wirklich wollen, aber ich denke, Sie wollen ein Tabelle pro Klassenhierarchie
In diesem Fall, jede Entität ist, die Sortierung einer DISCRIMINATOR_COLUMN wie folgt
Und Ihre Kinder zugeordnet, nach
Um zu testen, lassen Sie uns die folgenden
Aber, statt der Vererbung (die Sie können sehen, eine Menge von NULL-Spalte, die durch mehr als ein Unternehmen teilen sich die gleiche Tabelle - wenn Sie mit InheritanceType.SINGLE_TABLE-Strategie), Ihr Modell besser wäre wie folgt
Fühlen Sie sich frei, um die Wahl der besten Vorgehensweise, die Ihre Bedürfnisse erfüllen.
Grüße,