Beschrijving

De volgende benadering voor het opslaan van een klassenhiërarchie is het opslaan van alle klassen in de hiërarchie in een enkele tabel . Deze strategie wordt Single Table genoemd .

Bijvoorbeeld als volgt:

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

Dat wil zeggen, we hebben één tabel waarin de kolommen voor alle klassen van onze hiërarchie met verschillende kleuren zijn gemarkeerd. Er is ook een speciale servicekolom DTYPE VARCHAR , waar Hibernate de naam van de Entity-klasse opslaat.

Het enige wat je nog hoeft te doen, is aan Hibernate uitleggen dat de gegevens van Entity-klassen nu in één tabel in de database zijn opgeslagen. Dit kan worden gedaan met behulp van de annotatie @Inheritance :

@Inheritance(strategy = InheritanceType.SINGLE_TABLE)

Een voorbeeld van onze lessen:

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

Hoe gegevens worden opgeslagen

Laten we nu een voorbeeld schrijven waarin we een aantal van onze entiteiten maken en deze opslaan in de database:

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);

Bij het opslaan in de database wordt de volgende SQL-query uitgevoerd:

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')

Bij het opslaan van gegevens in een tabel geeft Hibernate alleen de entiteitsvelden door die hem bekend zijn. Dit betekent dat niet-gespecificeerde kolommen NULL zijn.

En dit betekent dat u het type NOT NULL niet kunt specificeren voor de bezettingskolom, aangezien wanneer een klant in dezelfde tabel wordt opgeslagen, zijn bezetting NULL zal zijn. Dit is een van de nadelen van het opslaan van verschillende entiteiten in dezelfde tabel.

Het laatste veld in de SQL-query is de DTYPE-kolom, die de naam van de Entity-klasse bevat. Het wordt gebruikt door Hibernate wanneer u gegevens uit uw tabel wilt lezen.

Voorbeeld:

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

Deze query retourneert een lijst met alle gebruikersobjecten die in de database zijn opgeslagen: gebruiker, werknemer en klant. Op basis van de kolom DTYPE wordt het entiteitstype correct bepaald en wordt een object van de juiste klasse gemaakt.

In ons geval zullen er twee objecten in de rekeningenlijst staan: een Medewerker type en een Klant type.

HQL-regels.