Tabla unida

All lectures for ES purposes
Nivel 1, Lección 245
Disponible

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