Beschrijving

Een andere strategie voor het opslaan van een klassenhiërarchie in een database wordt Joined Table genoemd. Er is een speciale annotatie voor:

@Inheritance(strategy = InheritanceType.JOINED)

Een voorbeeld van onze lessen:

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

Wanneer u deze annotatie gebruikt, verwacht Hibernate een aparte tabel in de database voor elke klasse en subklassen. Wanneer u er gegevens uit selecteert, moet u de SQL JOIN-operator gebruiken.

Voorbeeld van databaseschema:

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
}

Als u besluit om de gegevens van een client uit de tabel te halen, moet Hibernate JOIN gebruiken om aan de tabellen deel te nemen:

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

@PrimaryKeyJoinColumn

Onderliggende Entiteitsklassen hebben een kolom in de tabel die verwijst naar het object-ID van de bovenliggende Entiteitsklasse. De naam van deze kolom is standaard gelijk aan de naam van de kolom van de bovenliggende klasse.

Voorbeeld:

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

Dan ziet de databasetabel er als volgt uit:

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
}

Als u de kolomnaam in afhankelijke tabellen wilt overschrijven, moet u de annotatie @PrimaryKeyJoinColumn gebruiken . Voorbeeld:

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

Dan ziet de databasetabel er als volgt uit:

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
}