Professional Documents
Culture Documents
Herança de Entidades
Última revisão: 03/05/2008
1.1 - Introdução
A JPA fornece três maneiras de mapear uma herança para um banco de dados
relacional
Uma única tabela por toda hierarquia de classe
Uma única tabela terá todas as propriedades de cada classe na hierarquia
Vejamos como anotar nossas classes para mapear esta estratégia de herança
@Entity
@Table(name="HIERARQUIA_PESSOA")
@Inheritance(strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name="tipoObjeto",
discriminatorType=DiscriminatorType.STRING)
@DiscriminatorValue("pessoa")
public class Pessoa implements Serializable {
protected int id;
protected String nome;
protected String sobrenome;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public int getId() {
return id;
}
@Entity
@DiscriminatorValue(“ASSALARIADO”) // opcional
public class Assalariado extends Pessoa {
protected double salario;
}
Pós-Graduação em
Desenvolvimento de Sistemas para Web – Disciplina:
Frameworks de Persistência de Dados para a Web
@Entity
public class Empregado extends Assalariado {
private String rua;
private String cidade;
private String cep;
....
}
1.2.1 - Vantagens
1.2.2 - Desvantagens
@Entity
@Inheritance(strategy=InheritanceType=TABLE_PER_CLASS)
public class PESSOA {
...
}
@Entity
public class Assalariado extends Pessoa {
...
}
Pós-Graduação em
Desenvolvimento de Sistemas para Web – Disciplina:
Frameworks de Persistência de Dados para a Web
@Entity
public class Empregado extends Assalariado {
...
}
1.3.1 - Vantagens
1.3.2 - Desvantagens
Esta estratégia não é normalizada, uma vez que ela tem colunas redundantes
em cada uma de suas tabelas para cada uma das propriedades da classe básica.
Cada subclasse tem sua própria tabela, mas essa tabela só contém as
propriedades definidas nessa classe particular.
Semelhante a estratégia TABLE_PER_CLASS, exceto pelo esquema ser
normalizado
Também conhecida como estratégia JOINED
Pós-Graduação em
Desenvolvimento de Sistemas para Web – Disciplina:
Frameworks de Persistência de Dados para a Web
Nesse mapeamento, deve haver uma coluna em cada tabela que possa ser
utilizada para unir todas elas. Em nosso exemplo, as tabela EMPREGADO,
ASSALARIADO e PESSOA compartilham os mesmos valores de chave
primária.
@Entity
@Inheritance(strategy=InheritanceType.JOINED)
public class Pessoa {
...
}
@Entity
public class Assalariado extends Pessoa {
...
}
@Entity
@PrimaryKeyJoinColumn(name=” PK_EMPREGADO”)
public class Empregado extends Assalariado {
...
}
O gerenciador de persistência precisa saber quais colunas em cada tabela
serão utilizadas para realizar uma junção ao carregar uma entidade com uma
estratégia de herança JOINED.
1.4.1 - Vantagens
1.4.2 - Desvantagens
Às vezes, porém, você precisa herdar algo de uma superclasse que não seja
entidade. Essa superclasse pode ser uma classe existente em seu modelo de
domínio que você não quer transformar em uma entidade.
A anotação @javax.persistence.MappedSuperclass permite definir este
tipo de mapeamento.
@MappedSuperClass
public class Pessoa implements Serializable {
private int id;
private String nome;
private String sobrenome;
@Entity
@Table(name=”ASSALARIADO”)
@Inheritance(strategy=InheritanceType.JOINED)
// A anotação @AttributeOverride é opcional
@AttributeOverride(name=”sobrenome”,
column=@Column(name=”SOBRENOME_ASSALARIADO”))
public class Assalariado extends Pessoa {
...
}
@Entity
@Table(name=”EMPREGADO”)
public class Empregado extends Assalariado {
...
}
Como Pessoa não é uma entidade, a superclasse mapeada não tem uma tabela
associada. Qualquer subclasse herda as propriedades de persistência da classe
básica. Você pode sobreescrever qualquer propriedade mapeada da classe
mapeada utilizando a anotação @javax.persistence.AttributeOverride
Neste exercício, cabe a você, aluno, mapear o diagrama de classes abaixo para um
banco de dados utilizando a estratégia de tabela única para toda a hierarquia de
classes.
Após mapear, crie uma classe com um método main() que teste a persistência de
todos os objetos da hierarquia acima. Também não esqueça de testar consultas com
todos os objetos desta hierarquia.