O JPA (Java Persistence API) fornece várias anotações para mapear classes Java para tabelas de banco de dados. Uma dessas anotações úteis é a @MappedSuperclass, que é usada para designar uma classe cujas propriedades devem ser herdadas por outras classes de entidade, mas que não é uma entidade em si. Vamos explorar a utilidade dessa anotação através de um exemplo prático envolvendo classes como Veiculo, Carro e Motocicleta.
O Que é @MappedSuperclass?
A anotação @MappedSuperclass é usada para indicar que uma classe não deve ser uma entidade independente, mas que seus atributos devem ser herdados por outras classes que são entidades. Isso é útil quando você deseja compartilhar atributos comuns entre várias entidades sem criar uma tabela separada para a classe base.
Principais características:
- - A classe anotada com @MappedSuperclass não é uma entidade.
- - Não é possível executar consultas diretamente na classe @MappedSuperclass.
- - As subclasses que estendem a classe @MappedSuperclass são mapeadas para tabelas individuais no banco de dados, mas herdam os campos da classe base.
Exemplo Prático
Vamos criar um exemplo com uma hierarquia de classes para Veiculo, Carro e Motocicleta, onde Veiculo é a superclasse.
1. Classe Base: Veiculo
import javax.persistence.MappedSuperclass;
@MappedSuperclass
public abstract class Veiculo {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String marca;
private String modelo;
private int ano;
// Getters e Setters
}
- A classe Veiculo é anotada com @MappedSuperclass.
- A classe Veiculo possui o campo id anotado com @id e @GeneratedValue. Este identificador único será herdado por todas as subclasses, garantindo que cada entidade derivada de Veiculo tenha um campo id.
- Ela define três atributos comuns: marca, modelo e ano.
2. Subclasse: Carro
import javax.persistence.Entity;
import javax.persistence.Table;
@Entity
@Table(name = "carro")
public class Carro extends Veiculo {
private int quantidadePortas;
// Getters e Setters
}
- A classe Carro herda os atributos da classe Veiculo.
- Ela é anotada com @Entity e mapeada para uma tabela chamada carro.
3. Subclasse: Motocicleta
import javax.persistence.Entity;
import javax.persistence.Table;
@Entity
@Table(name = "motocicleta")
public class Motocicleta extends Veiculo {
private boolean temSidecar;
// Getters e Setters
}
- A classe Motocicleta também herda os atributos da classe Veiculo.
- Ela é anotada com @Entity e mapeada para uma tabela chamada motocicleta.
Mapeamento de Tabelas
Com as classes acima, o JPA criará as seguintes tabelas no banco de dados:
- Tabela carro: Contém colunas para marca, modelo, ano e quantidadePortas.
- Tabela motocicleta: Contém colunas para marca, modelo, ano e temSidecar.
A tabela Veiculo não existe no banco de dados, pois a classe Veiculo é apenas uma superclasse e não uma entidade.
Benefícios de usar @MappedSuperclass
- Centralização do Identificador: O campo id é gerenciado na superclasse. Todas as entidades derivadas de Veiculo compartilham o mesmo esquema de identificação.
- Reutilização de Código: Atributos comuns podem ser centralizados em uma superclasse, evitando duplicação nas subclasses.
- Facilidade de Manutenção: Alterações em atributos comuns podem ser feitas em um único lugar.
- Modelo de Dados Coeso: As subclasses compartilham a mesma estrutura, o que facilita a manipulação e o entendimento do modelo.
Considerações
Se você deseja que a superclasse também seja uma entidade (por exemplo, para consultas diretas), use a estratégia de herança @Inheritance em vez de @MappedSuperclass.
@MappedSuperclass é ideal para situações em que a classe base não precisa ser persistida como uma entidade individual, mas suas propriedades são relevantes para várias entidades.
Conclusão
A anotação @MappedSuperclass é uma ferramenta poderosa para criar hierarquias de classes reutilizáveis em JPA. No exemplo acima, conseguimos centralizar os atributos comuns em Veiculo e, ao mesmo tempo, manter a flexibilidade e a independência das entidades Carro e Motocicleta. Essa abordagem promove um design mais limpo e modular, especialmente em sistemas com múltiplas entidades que compartilham características semelhantes.
Top comments (1)
Muito bacana. Não conhecia a anottation. Valeu