Dev (Back & Front)ARTIGO

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. 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;<br /><br />import javax.persistence.Column;<br />import javax.persistence.Id;<br />import javax.persistence.MappedSuperclass;<br />import javax.persistence.Temporal;<br />import javax.persistence.TemporalType;<br /><br />@MappedSuperclass<br />public abstract class Pessoa {<br /><br />@Id<br />private Long codigo;<br /><br />@Column(length = 60, nullable = false)<br />private String nome;<br /><br />@Temporal(TemporalType.DATE)<br />private Date dataCadastro;<br /><br />//métodos get e set...<br />}

Agora vou criar as classes (entidades) Cliente e Usuario que herdarão as propriedades da classe Pessoa: 

import javax.persistence.Column;<br />import javax.persistence.Entity;<br />import javax.persistence.Table;<br /><br />@Entity<br />@Table(name = "Usuarios")<br />public class Usuario extends Pessoa {<br /><br />@Column(length = 20, nullable = false)<br />private String login;<br /><br />@Column(length = 20, nullable = false)<br />private String senha;<br /><br />//métodos get e set...<br />}
import javax.persistence.Column;<br />import javax.persistence.Entity;<br />import javax.persistence.Table;<br /><br />@Entity<br />@Table(name="Clientes")<br />public class Cliente extends Pessoa {<br /><br />@Column(length = 50)<br />private String email;<br /><br />@Column(length = 100)<br />private String endereco;<br /><br />@Column(length = 20)<br />private String telefone;<br /><br />//métodos get e set...<br /><br />}

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.

é Desenvolvedor de software há mais de 4 anos, utilizando Java, C#, Php, Asp e Delphi com diversos SGDB's. É Bacharel em Sistemas de Informação e possui as certificações SCJP (Sun Certified Java Programmer) e SCWCD (Sun Certified Web Component Developer). Mantém o blog http://www.rodrigolazoti.com.br

Ver perfil