首頁> Java> java教程> 主體

理解 JPA 中的 @MappedSuperclass

PHPz
發布: 2024-08-25 18:00:36
原創
967 人瀏覽過

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 }
登入後複製
  • 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:

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

以上是理解 JPA 中的 @MappedSuperclass的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!