Hibernate erweitert Entität für dieselbe Tabelle

8

Ich habe eine Tabelle mit zwei Feldern Ich hätte gerne zwei Objekte.

Erstens hat nur field1

%Vor%

Der zweite hat alle zwei Felder

%Vor%

Ich lade jedes mit

%Vor%

Was ich tun möchte, ist TableObject extend SimpleTableObject . Wie würde ich das machen?

    
Quillion 05.03.2017, 14:24
quelle

5 Antworten

4

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

verwenden

Aber 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.

    
Bhushan Uniyal 16.03.2017, 18:23
quelle
3

Ich konnte etwas an deiner Frage tun. Ich habe eine andere Klassenhierarchie definiert: UserWithRole, die den Benutzer ähnlich wie deins erweitert.

Definieren Sie die Klasse User als Entität mit der Vererbungsstrategie SINGLE_TABLE :

%Vor%

Diese Vererbungsstrategie hat einen erheblichen Nachteil:

  • Unterklassen dürfen keine Spalten enthalten, die keine Nullwerte enthalten können.

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.

Definieren Sie UserWithRole class:

%Vor%

Fügen Sie Helper class hinzu, um Benutzer in der Datenbank zu erstellen und verwenden Sie Ihre Abfrage:

%Vor%

Wie Sie vielleicht sehen, habe ich Ihre Methode ein wenig geändert:

  • Generischer Typ hinzugefügt, um unsichere Typumwandlungen zu vermeiden;
  • Benutzter Entitätsname anstelle von Tabellenname, da HQL den Entitätsnamen erwartet.

Fangen wir an zu testen

Erhalte alle User Instanzen:

%Vor%

Ausgabe (Benutzer mit Rolle sind immer noch UserWithProfile Instanzen zur Laufzeit):

%Vor%

SQL-Abfrage von Hibernate:

%Vor%

Erhalte alle UserWithProfile Instanzen:

%Vor%

Ausgabe:

%Vor%

SQL-Abfrage von Hibernate:

%Vor%

Bitte lassen Sie mich wissen, wenn Sie das suchen.

    
vhula 14.03.2017 02:26
quelle
2

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.

    
Reborn 05.03.2017 14:32
quelle
2

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.

    
Dragan Bozanovic 10.03.2017 13:55
quelle
1

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.

    
Simon 10.03.2017 05:19
quelle

Tags und Links