Wenn Sie allgemeine Felder in Ihren erforderlichen Tabellen speichern wollen, nehmen Sie an, Sie haben Klasse A und B und Sie haben ein gemeinsames Feld wie created_by, updated_by und Sie wollen field1, field2 in beiden Entitäten speichern: Auf Datenbankebene:
%Vor%Für diese Art von Struktur sollten Sie @MappedSuperclass als @Dragan Bozanovic vorgeschlagen
verwendenAber wenn Sie Eltern-Kind-Beziehung wollen und Tabelle pro Klasse generieren möchten, dann können Sie verwenden @ Vererbung (Strategie = Vererbungstyp.TABLE_PER_CLASS) es wird Tabelle pro Klasse erstellen Beispiel: Angenommen, Sie haben eine 2-Klassen-Zahlung und -Kreditkarte, Zahlung ist die Elternklasse für die Kreditkarte.
%Vor%Jetzt speichern Sie das Datum:
%Vor%dann werden die Daten wie
gespeichert %Vor%Es gibt 3 Vererbungstypen, die im Ruhezustand verwendet werden. Hier ist Hibernate-doc für die Vererbung Ссылка , Sie sollten eine davon entsprechend Ihrer Anforderung auswählen.
Ich konnte etwas an deiner Frage tun. Ich habe eine andere Klassenhierarchie definiert: UserWithRole, die den Benutzer ähnlich wie deins erweitert.
User
als Entität mit der Vererbungsstrategie SINGLE_TABLE
: Diese Vererbungsstrategie hat einen erheblichen Nachteil:
Es gibt eine weitere Strategie JOINED
, mit der nicht-nullfähige Spalten in Unterklassen erstellt werden können. Es erstellt eine zusätzliche Tabelle für jede Unterklasse, die diese Tabellen FK in der Oberklasse-Tabelle haben.
UserWithRole
class: Helper
class hinzu, um Benutzer in der Datenbank zu erstellen und verwenden Sie Ihre Abfrage: Wie Sie vielleicht sehen, habe ich Ihre Methode ein wenig geändert:
User
Instanzen: Ausgabe (Benutzer mit Rolle sind immer noch UserWithProfile
Instanzen zur Laufzeit):
SQL-Abfrage von Hibernate:
%Vor%UserWithProfile
Instanzen: Ausgabe:
%Vor%SQL-Abfrage von Hibernate:
%Vor%Bitte lassen Sie mich wissen, wenn Sie das suchen.
Gute Frage, ich nehme an, Sie müssen sich @MappedSuperclass
anotation ansehen. Es ermöglicht eine "abstrakte" Entitätsklasse, die nicht instanziiert werden würde, aber Sie können davon ausgehen.
Siehe Beispiel hier
Update: Da Sie @Entity
anotation verwenden, müssen Sie @Table
nicht verwenden, da Hibernate die Tabelle mit dem Namen @Entity
für Sie erstellt.
Sie können eine gemeinsame Oberklasse für beide Entitäten haben:
%Vor% Zusätzlich können Sie die Entität SimpleTableObject
als % markieren. co_de% wie oben gezeigt, so dass es nicht persistiert oder versehentlich aktualisiert werden kann.
Der Kommentar ist ein bisschen zu lang, also muss ich es in die Antwort schreiben.
Werden Sie zwei separate DAO haben, um TableObject
und SimpleTableObject
separat zu erhalten? Wenn ja, brauchen Sie die Erweiterung nicht, behandeln Sie sie einfach als zwei separate Entitäten. Wenn nicht, können Sie zuerst das TableObject abrufen und vielleicht einen Konstruktor mit SimpleTableObject(TableObject)
erstellen und alle Felder kopieren, die Sie dort benötigen. Ich glaube nicht, dass es möglich ist, zwei Entitäten mit einer findById
-Funktion abzurufen. Hibernate wird verwirrt, welche Entity mit der ID zugeordnet werden soll, was bedeutet, dass es nicht viel Sinn macht, die Erweiterung zu haben. Wenn Sie die Konsistenz beibehalten möchten, sollten Sie SimpleTableObject als Ansicht von TableObjec betrachten.
UPDATE : @Quillion Ich glaube nicht, dass dies möglich ist. Da diese beiden Entitäten im Prinzip identisch sind (Sie können einige Felder in einer Entität ignorieren), gibt es keine Möglichkeit für Hibernate, zu identifizieren, welche Entität zugeordnet werden soll. Natürlich können Sie eine zusätzliche Spalte als Diskriminator hinzufügen und dann die @Inheritance(strategy=InheritanceType.SINGLE_TABLE)
verwenden, um diese beiden Entitäten zuzuordnen, aber ich nehme an, dies ist nicht das, was Sie wollen.