Home Herança nas Entidades - Jakarta EE
Post
Cancelar

Herança nas Entidades - Jakarta EE

Baseado nos cursos da Softblue

@MappedSuperclass

• Uma entidade pode herdar propriedades de uma superclasse

– Ela deve ser anotada com @MappedSuperclass

1
2
3
4
5
6
@MappedSuperclass//Não é gerada uma tabela Pessoa
public class Pessoa {
  @Id
  private Integer id;
  // getters & setters...
}
1
2
3
4
5
@Entity(name = "PFISICA")
public class PessoaFisica extends Pessoa {
  private String cpf;
  // getters & setters...
}
classDiagram
    class PFISICA{
      integer id
      varchar(255) cpf
    }
1
2
3
4
5
@Entity(name = "PJURIDICA")
public class PessoaJuririca extends Pessoa {
  private String cnpj;
  // getters & setters...
}
classDiagram
    class PJURIDICA{
      integer id
      varchar(255) cnpj
    }

Herança de Uma Classe “Normal”

• Uma entidade pode herdar de uma classe “normal”

– Que não é uma entidade

– Que é não é uma @MappedSuperclass

• Neste caso, as propriedades que não pertencem à entidade não poderão ser persistidas

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class Pessoa {
  private String nome;//O atributo nome não é mapeado para o BD
}

@Entity(name = "PFISICA")
public class PessoaFisica extends Pessoa {
  @Id
  private Integer id;
  private String cpf;
}
@Entity(name = "PJURIDICA")
public class PessoaJuririca extends Pessoa {
  @Id
  private Integer id;
  private String cnpj;
}

Herança Entre Entidades

• Uma entidade pode herdar de outra

• No BD, o mapeamento da herança pode seguir uma das seguintes estratégias

– Uma tabela por hierarquia de classes

– Uma tabela por entidade

– Uma tabela por subclasse (com possibilidade de realizar um join entre tabelas)

• Uma tabela por hierarquia de classes

1
2
3
4
5
6
7
8
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)//@Inheritance define a estratégia
public abstract class Pessoa {
  @Id
  @GeneratedValue
  private Integer id;
  private String nome;
}

Se @Inheritance não for especificada, SINGLE_TABLE é usada por padrão

1
2
3
4
5
6
7
8
@Entity
public class PessoaFisica extends Pessoa {
  private String cpf;
}
@Entity
public class PessoaJuridica extends Pessoa {
  private String cnpj;
}

DTYPE Indica o tipo da entidade (PessoaFisica ou PessoaJuridica)

classDiagram
    class PESSOA{
      varchar(31) DTYPE
      integer id
      varchar(255) nome
      varchar(255) cpf
      varchar(255) cnpj
    }

• Uma tabela por entidade

1
2
3
4
5
@Entity
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public abstract class Pessoa {
  //...
}

As colunas se repetem em cada tabela

Dependendo do persistence provider que você use, esta estratégia pode não estar disponível

classDiagram
    class PFISICA{
      integer id
      varchar(255) nome
      varchar(255) cpf
    }
    class PJURIDICA {
      integer id
      varchar(255) nome
      varchar(255) cnpj
    }

• Uma tabela por subclasse

1
2
3
4
5
@Entity
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class Pessoa {
  //...
}

As tabela das subclasses referenciam a tabela da superclasse

classDiagram
    class PESSOA{
      integer id
      varchar(255) nome
    }
    class PFISICA{
      integer id
      varchar(255) cpf
    }
    class PJURIDICA {
      integer id
      varchar(255) cnpj
    }
    PESSOA <.. PFISICA
    PESSOA <.. PJURIDICA

Configurando a Coluna DTYPE

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(
  name = "TIPO",//Nome da coluna
  discriminatorType = DiscriminatorType.INTEGER,//Tipo do discriminador (STRING, INTEGER, CHAR)
  length = 5)//Tamanho do campo
public abstract class Pessoa {
  //...
}

@Entity
@DiscriminatorValue("1")//Define o valor a ser usado no discriminador
public class PessoaFisica extends Pessoa {
  //...
}
Esta postagem está licenciada sob CC BY 4.0 pelo autor.