Herança de propriedades entre entidades com JPA
Muitas vezes temos várias entidades em um projeto que possuem propriedades em comum como código ou nome por exemplo e que para facilitar a criação dessas entidades pode-se criar uma superclasse que não é uma entidade e que contenha as propriedades que serão herdadas pelas entidades.
Vamos criar um cenário bem simples com duas entidades Cliente e Usuário para exemplificar, conforme a representação UML a seguir:

Analisando este diagrama vemos que três propriedades são comuns entre as duas classes:
- codigo
- nome
- dataCadastro
Com isso irei mudar nosso diagrama e adicionar uma nova classe que irá conter as três propriedades que serão herdadas por outras classes. O novo diagrama UML ficará da seguinte forma:

Falando um pouco sobre JPA, uma entidade pode herdar algo de uma superclasse sendo que esta superclasse é uma classe em seu modelo de domínio que não será transformada em uma entidade. Para resolver este problema temos a anotação @javax.persistence.MappedSuperclass.
Irei mostrar agora como ficará as entidades Cliente e Usuario fazendo herança das propriedades da classe Pessoa. Primeiro vou criar a superclasse Pessoa que será marcada com a anotação JPA MappedSuperclass:
import java.util.Date;
import javax.persistence.Column;
import javax.persistence.Id;
import javax.persistence.MappedSuperclass;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
@MappedSuperclass
public abstract class Pessoa {
@Id
private Long codigo;
@Column(length = 60, nullable = false)
private String nome;
@Temporal(TemporalType.DATE)
private Date dataCadastro;
//métodos get e set...
}
Agora vou criar as classes (entidades) Cliente e Usuario que herdarão as propriedades da classe Pessoa:
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
@Entity
@Table(name = "Usuarios")
public class Usuario extends Pessoa {
@Column(length = 20, nullable = false)
private String login;
@Column(length = 20, nullable = false)
private String senha;
//métodos get e set...
}
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
@Entity
@Table(name="Clientes")
public class Cliente extends Pessoa {
@Column(length = 50)
private String email;
@Column(length = 100)
private String endereco;
@Column(length = 20)
private String telefone;
//métodos get e set...
}
Com isso teremos três classes, mas somente duas entidades. As classes (entidades) Cliente e Usuario vão herdar as propriedades da classe Pessoa que não é uma entidade.
Related Posts
Cara,
Não acho uma boa idéia usar herança apenas para herdar atributos, seria melhor vc criar um objeto que contenha esses atributos em comum, ex: DadosBasicos e compor as classes que precisam com isso. Herdar, só se for para herdar comportamento e ainda tem uma galera(inclusive do proprio JAVA) que fala que vc nunca deve herdar nada, só usar interfaces e composição(“Sempre prefira composição a herança”)…
Valeu,
Alberto
Alberto, entendo seu ponto de vista e concordo que preferir composição a herança seja uma abordagem correta, mas no caso que várias entidades compartilharem um mesmo atributo, não vejo problemas em utilizar herança.
Para comportamento eu prefiro utilizar interfaces.
[]‘s.
Ola como eu importaria o “javax.persistence.Entity”, é uma Libery ???
Obrigado
Gleyson, voce precisa ter os jar’s para JPA/EJB3.
Cara, desculpa reviver seu post, sou iniciante nesse mundo JPA…
Gostaria de saber: tenho uma classe
PessoaManager
como faço para obter uma lista de pessoas sem ser por query explícita ???
tipo
@OneToMany(????)
Collection pessoas;
Fala ai cara!
Poxa.. estou tendo um problema sério aqui com heranças. Fiz um projeto que qdo crio as entidades pelo netbeans e dps faço empresa, administrador, candidato estenderem Usuario, que tem dados comuns a todas, os meus Daos do JPA referentes a estas entidades dão problema em algumas linhas do for, e pede para eu adicionar cast ou trocar para Usuario. Sabe o que pode ser isso?