Descriere

O altă strategie pentru stocarea unei ierarhii de clasă într-o bază de date se numește Joined Table. Există o adnotare specială pentru el:

@Inheritance(strategy = InheritanceType.JOINED)

Un exemplu de orele noastre:

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

Când utilizați această adnotare, Hibernate se va aștepta la un tabel separat în baza de date pentru fiecare clasă și subclasele sale. La selectarea datelor din ele, va trebui să utilizați operatorul SQL JOIN.

Exemplu schema bazei de date:

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
}

Dacă decideți să obțineți datele unui client din tabel, atunci Hibernate va trebui să folosească JOIN pentru a se alătura tabelelor:

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

@PrimaryKeyJoinColumn

Clasele de entitate copil au o coloană în tabel care se referă la id-ul de obiect al clasei de entitate părinte. Numele acestei coloane este implicit egal cu numele coloanei clasei părinte.

Exemplu:

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

Apoi tabelul bazei de date va arăta astfel:

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
}

Dacă doriți să înlocuiți numele coloanei în tabelele dependente, atunci trebuie să utilizați adnotarea @PrimaryKeyJoinColumn . Exemplu:

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

Apoi tabelul bazei de date va arăta astfel:

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
}