Description

Une autre stratégie pour stocker une hiérarchie de classes dans une base de données est appelée table jointe. Il y a une annotation spéciale pour cela :

@Inheritance(strategy = InheritanceType.JOINED)

Un exemple de nos cours :

@Inheritance(strategy = InheritanceType.JOINED)
@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;
}

Lors de l'utilisation de cette annotation, Hibernate attendra une table séparée dans la base de données pour chaque classe et ses sous-classes. Lors de la sélection de données à partir d'eux, vous devrez utiliser l'opérateur SQL JOIN.

Exemple de schéma de base de données :

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

Si vous décidez d'obtenir les données d'un client à partir de la table, alors Hibernate devra utiliser JOIN pour joindre les tables :

SELECT u.id, u.name, u.birthday, c.address FROM user u JOIN client c ON u.id = c.id;

@PrimaryKeyJoinColumn

Les classes Entity enfant ont une colonne dans le tableau qui fait référence à l'ID d'objet de la classe Entity parent. Le nom de cette colonne est par défaut égal au nom de la colonne de la classe mère.

Exemple:

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

Ensuite, la table de la base de données ressemblera à ceci :

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

Si vous souhaitez remplacer le nom de la colonne dans les tables dépendantes, vous devez utiliser l' annotation @PrimaryKeyJoinColumn . Exemple:

@Inheritance(strategy = InheritanceType.JOINED)
@Entity
class User {
  @Id
  int user_identifier;
  String name;
  LocalDate birthday;
}
@Entity
@PrimaryKeyJoinColumn(name=”user_id”)
class Employee extends User {
 	String occupation;
 	int salary;
 	LocalDate join;
}
@Entity
@PrimaryKeyJoinColumn(name=”user_id2”)
class Client extends User {
   String address;
}

Ensuite, la table de la base de données ressemblera à ceci :

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