Beschreibung

Eine andere Strategie zum Speichern einer Klassenhierarchie in einer Datenbank heißt Joined Table. Dazu gibt es eine besondere Anmerkung:

@Inheritance(strategy = InheritanceType.JOINED)

Ein Beispiel unserer Kurse:

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

Bei Verwendung dieser Annotation erwartet Hibernate für jede Klasse und ihre Unterklassen eine separate Tabelle in der Datenbank. Wenn Sie Daten daraus auswählen, müssen Sie den SQL JOIN-Operator verwenden.

Beispiel für ein Datenbankschema:

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
}

Wenn Sie sich entscheiden, die Daten eines Clients aus der Tabelle abzurufen, muss Hibernate JOIN verwenden, um die Tabellen zu verbinden:

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

@PrimaryKeyJoinColumn

Untergeordnete Entity-Klassen verfügen über eine Spalte in der Tabelle, die auf die Objekt-ID der übergeordneten Entity-Klasse verweist. Der Name dieser Spalte entspricht standardmäßig dem Namen der Spalte der übergeordneten Klasse.

Beispiel:

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

Dann sieht die Datenbanktabelle so aus:

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
}

Wenn Sie den Spaltennamen in abhängigen Tabellen überschreiben möchten, müssen Sie die Annotation @PrimaryKeyJoinColumn verwenden . Beispiel:

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

Dann sieht die Datenbanktabelle so aus:

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
}