Back-End

1 abr, 2009

Herança de propriedades entre entidades com JPA

Publicidade

Muitas vezes temos várias entidades em um projeto que possuem
propriedades em comum, como código ou nome, por exemplo. 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ão 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.