Description

L'approche suivante pour stocker une hiérarchie de classes consiste à stocker toutes les classes de la hiérarchie dans une seule table . Cette stratégie s'appelle Single Table .

Par exemple, comme ceci :

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

Autrement dit, nous avons une table dans laquelle les colonnes de toutes les classes de notre hiérarchie sont marquées de couleurs différentes. Il existe également une colonne de service spéciale DTYPE VARCHAR , où Hibernate stockera le nom de la classe Entity.

La seule chose qui reste à faire est d'expliquer à Hibernate que les données des classes Entity sont maintenant stockées dans la base de données dans une table. Cela peut être fait en utilisant l' annotation @Inheritance :

@Inheritance(strategy = InheritanceType.SINGLE_TABLE)

Un exemple de nos cours :

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

Comment les données sont stockées

Écrivons maintenant un exemple dans lequel nous créons quelques-unes de nos entités et les enregistrons dans la base de données :

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

Lors de l'enregistrement dans la base de données, la requête SQL suivante sera exécutée :

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

Lors de l'enregistrement de données dans une table, Hibernate ne transmet que les champs d'entité connus de lui. Cela signifie que les colonnes non spécifiées seront NULL.

Et cela signifie que vous ne pouvez pas spécifier le type NOT NULL pour la colonne d'occupation, car lorsqu'un client est stocké dans la même table, son occupation sera NULL. C'est l'un des inconvénients du stockage de différentes entités dans la même table.

Le dernier champ de la requête SQL est la colonne DTYPE, qui contient le nom de la classe Entity. Il est utilisé par Hibernate lorsque vous souhaitez lire les données de votre table.

Exemple:

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

Cette requête renverra une liste de tous les objets de type utilisateur stockés dans la base de données : Utilisateur, Employé et Client. En fonction de la colonne DTYPE, le type d'entité sera correctement déterminé et un objet de la bonne classe sera créé.

Dans notre cas, il y aura deux objets dans la liste des comptes : un type Employé et un type Client.

Règles HQL.