Table jointe

All lectures for FR purposes
Niveau 1, Leçon 326
Disponible

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
}
Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION