Descrição

Outra estratégia para armazenar uma hierarquia de classes em um banco de dados é chamada de tabela unida. Existe uma anotação especial para isso:

@Inheritance(strategy = InheritanceType.JOINED)

Exemplo de nossas aulas:

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

Ao usar esta anotação, o Hibernate espera uma tabela separada no banco de dados para cada classe e suas subclasses. Ao selecionar dados deles, você terá que usar o operador SQL JOIN.

Exemplo de esquema de banco de dados:

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
}

Se você decidir pegar os dados de algum cliente da tabela, então o Hibernate terá que usar JOIN para juntar as tabelas:

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

@PrimaryKeyJoinColumn

As classes Entity filhas têm uma coluna na tabela que se refere ao id do objeto da classe Entity pai. O nome desta coluna é por padrão igual ao nome da coluna da classe pai.

Exemplo:

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

Então a tabela do banco de dados ficará assim:

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
}

Se você quiser substituir o nome da coluna em tabelas dependentes, precisará usar a anotação @PrimaryKeyJoinColumn . Exemplo:

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

Então a tabela do banco de dados ficará assim:

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
}