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
}
GO TO FULL VERSION