Descripción

Otra estrategia para almacenar una jerarquía de clases en una base de datos se denomina tabla unida. Hay una anotación especial para ello:

@Inheritance(strategy = InheritanceType.JOINED)

Un ejemplo de nuestras clases:

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

Al usar esta anotación, Hibernate esperará una tabla separada en la base de datos para cada clase y sus subclases. Al seleccionar datos de ellos, deberá utilizar el operador SQL JOIN.

Ejemplo de esquema de base de datos:

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 decide obtener los datos de algún cliente de la tabla, entonces Hibernate tendrá que usar JOIN para unir las tablas:

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

@PrimaryKeyJoinColumn

Las clases de Entidad secundaria tienen una columna en la tabla que hace referencia a la identificación del objeto de la clase de Entidad principal. El nombre de esta columna es por defecto igual al nombre de la columna de la clase padre.

Ejemplo:

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

Entonces la tabla de la base de datos se verá así:

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 desea anular el nombre de la columna en las tablas dependientes, debe usar la anotación @PrimaryKeyJoinColumn . Ejemplo:

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

Entonces la tabla de la base de datos se verá así:

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
}