Entendendo @MappedSuperclass em JPA

gregoriohd

Gregorio Santos

Posted on August 24, 2024

Entendendo @MappedSuperclass em JPA

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:

  1. - A classe anotada com @MappedSuperclass não é uma entidade.
  2. - Não é possível executar consultas diretamente na classe @MappedSuperclass.
  3. - 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

}
Enter fullscreen mode Exit fullscreen mode
  • 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

}
Enter fullscreen mode Exit fullscreen mode
  • 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
}
Enter fullscreen mode Exit fullscreen mode
  • 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:

  1. Tabela carro: Contém colunas para marca, modelo, ano e quantidadePortas.
  2. 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.

💖 💪 🙅 🚩
gregoriohd
Gregorio Santos

Posted on August 24, 2024

Join Our Newsletter. No Spam, Only the good stuff.

Sign up to receive the latest update from our blog.

Related