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:
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:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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...
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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.