Problèmes de conservation

Aujourd'hui, nous aurons un nouveau schéma super intéressant - utilisant les fonctionnalités Hibernate pour enregistrer la hiérarchie des classes dans la base de données.

Une hiérarchie de classes est un ensemble de classes liées les unes aux autres par une relation d'héritage.

Imaginez que vous ayez trois classes que vous souhaitez stocker dans la base de données :

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

Les classes sont héritées les unes des autres. Et la chose la plus intéressante est que vous souhaitez utiliser Hibernate afin de stocker des objets de ces classes dans la base de données.

Types de solutions

Hibernate a 4 façons possibles d'associer une hiérarchie de classes aux tables d'une base de données :

  • Superclasse mappée
  • table unique
  • Table jointe
  • Tableau par classe

Chaque stratégie suppose sa propre structure de table dans la base de données. Parfois, ils sont assez complexes. Mais les requêtes pour HQL sont très simples. C'est exactement le cas où les avantages d'Hibernate se manifestent clairement.

Je n'ai jamais entendu ces termes traduits en russe, je recommande donc également de les prononcer en anglais.

Ci-dessous, nous analyserons ce que chacun d'eux signifie.

@MappedSuperClass

Commençons par la solution la plus simple - dans la base de données, vous avez des tables distinctes pour chaque classe . Par exemple, ceux-ci :

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
}

Vous seul savez que les classes de ces tables sont connectées dans une hiérarchie . Si vous voulez qu'Hibernate le sache également, vous devez ajouter l' annotation @MappedSuperclass à la classe parent . Sans cela, Hibernate ignorera simplement les champs et les annotations de la classe parent.

Les classes avec cette annotation ressembleront à ceci :

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

C'est la façon la plus primitive de lier la hiérarchie des classes et la base de données. Cette approche permet en fait uniquement d'éviter les champs en double dans les classes.

Les requêtes de base de données dans HQL renverront uniquement l'entité dont le type est spécifié explicitement. Vous ne pouvez pas écrire une requête de base de données en HQL et obtenir une liste de tous les utilisateurs : Utilisateur, Employé, Client.