In Java, JPA, Programação

Herança de propriedades entre entidades com JPA

Posted August 4th, 2008 by Rodrigo Lazoti.

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

  1. Autenticação com Jboss Seam
  2. Orientação a objetos em Javascript – Herança
  3. Gerando arquivos PDF a partir de sua aplicação Java

6 responses to Herança de propriedades entre entidades com JPA

  1. Alberto says:

    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

  2. Rodrigo Lazoti says:

    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.

  3. Gleyson says:

    Ola como eu importaria o “javax.persistence.Entity”, é uma Libery ???

    Obrigado

  4. Rodrigo Lazoti says:

    Gleyson, voce precisa ter os jar’s para JPA/EJB3.

  5. Alex says:

    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;

  6. Patrick says:

    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?

Leave a response: