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 {
//...
}