Beschreibung

Der nächste Ansatz zum Speichern einer Klassenhierarchie besteht darin, alle Klassen in der Hierarchie in einer einzigen Tabelle zu speichern . Diese Strategie wird Single Table genannt .

Zum Beispiel so:

CREATE TABLE user_ employee_client {
  id INT,
  name VARCHAR,
  birthday DATE,
  occupation VARCHAR,
  salary INT,
  join DATE,
  address VARCHAR,
  DTYPE VARCHAR
}

Das heißt, wir haben eine Tabelle, in der die Spalten für alle Klassen unserer Hierarchie mit unterschiedlichen Farben markiert sind. Es gibt auch eine spezielle Servicespalte DTYPE VARCHAR , in der Hibernate den Namen der Entity-Klasse speichert.

Jetzt muss man Hibernate nur noch erklären, dass die Daten der Entity-Klassen nun in der Datenbank in einer Tabelle gespeichert werden. Dies kann mit der Annotation @Inheritance erfolgen :

@Inheritance(strategy = InheritanceType.SINGLE_TABLE)

Ein Beispiel unserer Kurse:

@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@Entity
class User {
  int id;
  String name;
  LocalDate birthday;
}
@Entity
class Employee extends User {
 	String occupation;
 	int salary;
 	LocalDate join;
}
@Entity
class Client extends User {
   String address;
}

Wie Daten gespeichert werden

Schreiben wir nun ein Beispiel, in dem wir einige unserer Entitäten erstellen und in der Datenbank speichern:

Employee employee = new Employee();
employee.id = 101;
employee.name = "Ivanov";
employee.birthday = LocalDate.of("01-01-1999");
employee.occupation = "Programmer"
employee.salary = 100000;
employee.join = LocalDate.of("12-01-2018");
session.persist(employee);

Client client = new Client();
client.id = 102;
client.name = "Petrov";
client.birthday = LocalDate.of("15-11-1988");
client.address = "Shandara";
session.persist(client);

Beim Speichern in der Datenbank wird folgende SQL-Abfrage ausgeführt:

INSERT INTO user_ employee_client (id, name, birthday, occupation, salary, join, DTYPE)
VALUES (101, 'Ivanov', '01-01-1999', 'Programmer', 100000, '12-01-2018', 'Employee')

INSERT INTO user_ employee_client (id, name, birthday, address, DTYPE)
VALUES (102, 'Petrov', '15-11-1988', 'Shandara', 'Client')

Beim Speichern von Daten in einer Tabelle übergibt Hibernate nur ihm bekannte Entitätsfelder. Das bedeutet, dass nicht spezifizierte Spalten NULL sind.

Und das bedeutet, dass Sie für die Berufsspalte nicht den Typ NOT NULL angeben können, da, wenn ein Kunde in derselben Tabelle gespeichert ist, sein Beruf NULL ist. Dies ist einer der Nachteile der Speicherung verschiedener Entitäten in derselben Tabelle.

Das letzte Feld in der SQL-Abfrage ist die DTYPE-Spalte, die den Namen der Entity-Klasse enthält. Es wird von Hibernate verwendet, wenn Sie Daten aus Ihrer Tabelle lesen möchten.

Beispiel:

List<User> accounts = session.createQuery("from User").list();

Diese Abfrage gibt eine Liste aller in der Datenbank gespeicherten Benutzertypobjekte zurück: Benutzer, Mitarbeiter und Kunde. Anhand der Spalte DTYPE wird der Entitätstyp korrekt ermittelt und ein Objekt der richtigen Klasse erstellt.

In unserem Fall gibt es zwei Objekte in der Kontenliste: einen Mitarbeitertyp und einen Kundentyp.

HQL-Regeln.