Naturschutzfragen

Heute haben wir ein neues und äußerst interessantes Schema – die Verwendung der Hibernate-Funktionen, um die Klassenhierarchie in der Datenbank zu speichern.

Eine Klassenhierarchie ist eine Menge von Klassen, die durch eine Vererbungsbeziehung miteinander verbunden sind.

Stellen Sie sich vor, Sie haben drei Klassen, die Sie in der Datenbank speichern möchten:

class User {
  int id;
  String name;
  LocalDate birthday;
}
class Employee extends User {
 	String occupation;
 	int salary;
 	LocalDate join;
}
class Client extends User {
   String address;
}

Klassen werden voneinander geerbt. Und das Interessanteste ist, dass Sie Hibernate verwenden möchten, um Objekte dieser Klassen in der Datenbank zu speichern.

Lösungstypen

Hibernate bietet vier Möglichkeiten, eine Klassenhierarchie mit Tabellen in einer Datenbank zu verknüpfen:

  • MappedSuperclass
  • Einzeltisch
  • Verbundener Tisch
  • Tisch pro Klasse

Jede Strategie setzt eine eigene Tabellenstruktur in der Datenbank voraus. Manchmal sind sie recht komplex. Aber Anfragen nach HQL an sie sind sehr einfach. Genau hier kommen die Vorteile von Hibernate deutlich zum Tragen.

Ich habe diese Begriffe noch nie ins Russische übersetzt gehört, daher empfehle ich, sie auch auf Englisch auszusprechen.

Im Folgenden analysieren wir, was jeder von ihnen bedeutet.

@MappedSuperClass

Beginnen wir mit der einfachsten Lösung: In der Datenbank gibt es für jede Klasse separate Tabellen . Zum Beispiel diese:

CREATE TABLE user {
  id INT,
  name VARCHAR,
  birthday DATE
}
CREATE TABLE employee {
  id INT,
  name VARCHAR,
  birthday DATE,
  occupation VARCHAR,
  salary INT,
  join DATE
}
CREATE TABLE client {
  id INT,
  name VARCHAR,
  birthday DATE,
  address VARCHAR
}

Nur Sie wissen , dass die Klassen für diese Tabellen hierarchisch miteinander verbunden sind . Wenn Sie möchten, dass auch Hibernate davon erfährt, müssen Sie der übergeordneten Klasse die Annotation @MappedSuperclass hinzufügen . Ohne sie ignoriert Hibernate einfach die Felder und Anmerkungen der übergeordneten Klasse.

Klassen mit dieser Annotation sehen folgendermaßen aus:

@MappedSuperclass
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;
}

Dies ist die primitivste Art, die Klassenhierarchie und die Datenbank zu verknüpfen. Mit diesem Ansatz können Sie eigentlich nur doppelte Felder in Klassen vermeiden.

Datenbankabfragen in HQL geben nur die Entität zurück, deren Typ explizit angegeben ist. Sie können keine Datenbankabfrage in HQL schreiben und eine Liste aller Benutzer erhalten: Benutzer, Mitarbeiter, Kunde.