"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Comprendre @MappedSuperclass dans JPA

Comprendre @MappedSuperclass dans JPA

Publié le 2024-09-02
Parcourir:505

Entendendo @MappedSuperclass em JPA

JPA (Java Persistence API) fournit plusieurs annotations pour mapper les classes Java aux tables de base de données. Une de ces annotations utiles est @MappedSuperclass, qui est utilisée pour désigner une classe dont les propriétés doivent être héritées par d'autres classes d'entités, mais qui n'est pas une entité elle-même. Explorons l'utilité de cette annotation à travers un exemple pratique impliquant des classes telles que Véhicule, Voiture et Moto.

Qu'est-ce que @MapedSuperclass ?

L'annotation @MappedSuperclass est utilisée pour indiquer qu'une classe ne doit pas être une entité indépendante, mais que ses attributs doivent être hérités par d'autres classes qui sont des entités. Ceci est utile lorsque vous souhaitez partager des attributs communs entre plusieurs entités sans créer une table distincte pour la classe de base.

Caractéristiques principales :

  1. - La classe annotée avec @MappedSuperclass n'est pas une entité.
  2. - Il n'est pas possible d'exécuter des requêtes directement sur la classe @MappedSuperclass.
  3. - Les sous-classes qui étendent la classe @MappedSuperclass sont mappées à des tables individuelles de la base de données, mais héritent des champs de la classe de base.

Exemple pratique

Créons un exemple avec une hiérarchie de classes pour Véhicule, Voiture et Moto, où Véhicule est la superclasse.

1. Classe de base : Véhicule

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

}
  • La classe Vehicle est annotée avec @MappedSuperclass.
  • La classe Vehicle a le champ id annoté avec @id et @GeneratedValue. Cet identifiant unique sera hérité par toutes les sous-classes, garantissant que chaque entité dérivée de Vehicle dispose d'un champ id.
  • Il définit trois attributs communs : la marque, le modèle et l'année.

2. Sous-classe : Voiture

import javax.persistence.Entity;
import javax.persistence.Table;

@Entity
@Table(name = "carro")
public class Carro extends Veiculo {

    private int quantidadePortas;

    // Getters e Setters

}
  • La classe Car hérite des attributs de la classe Vehicle.
  • Il est annoté avec @Entity et mappé à une table appelée car.

3. Sous-classe : Moto

import javax.persistence.Entity;
import javax.persistence.Table;

@Entity
@Table(name = "motocicleta")
public class Motocicleta extends Veiculo {

    private boolean temSidecar;

    // Getters e Setters
}
  • La classe Motorcycle hérite également des attributs de la classe Vehicle.
  • Il est annoté avec @Entity et mappé à une table appelée moto.

Mappage de tables

Avec les classes ci-dessus, JPA créera les tables suivantes dans la base de données :

  1. Tableau voiture : contient des colonnes pour la marque, le modèle, l'année et la quantité de portes.
  2. Tableau moto : contient des colonnes pour la marque, le modèle, l'année et le TemSidecar.

La table Vehicle n'existe pas dans la base de données, car la classe Vehicle n'est qu'une superclasse et non une entité.

Avantages de l'utilisation de @MappedSuperclass

  • Centralisation des identifiants : Le champ id est géré dans la superclasse. Toutes les entités dérivées de Véhicule partagent le même schéma d'identification.
  • Réutilisation du code : les attributs communs peuvent être centralisés dans une superclasse, évitant ainsi la duplication dans les sous-classes.
  • Facilité de maintenance : les modifications apportées aux attributs communs peuvent être effectuées en un seul endroit.
  • Modèle de données cohérent : les sous-classes partagent la même structure, ce qui rend le modèle plus facile à manipuler et à comprendre.

Considérations

Si vous souhaitez que la superclasse soit également une entité (par exemple pour les requêtes directes), utilisez la stratégie d'héritage @Inheritance au lieu de @MappedSuperclass.
@MappedSuperclass est idéal pour les situations où la classe de base n'a pas besoin d'être conservée en tant qu'entité individuelle, mais où ses propriétés sont pertinentes pour plusieurs entités.

Conclusion

L'annotation @MappedSuperclass est un outil puissant pour créer des hiérarchies de classes réutilisables dans JPA. Dans l’exemple ci-dessus, nous avons réussi à centraliser les attributs communs dans Véhicule et, en même temps, à conserver la flexibilité et l’indépendance des entités Voiture et Moto. Cette approche favorise une conception plus propre et plus modulaire, en particulier dans les systèmes comportant plusieurs entités partageant des caractéristiques similaires.

Déclaration de sortie Cet article est reproduit sur : https://dev.to/gregoriohd/entendendo-mappedsuperclass-em-jpa-4310?1 En cas de violation, veuillez contacter [email protected] pour le supprimer.
Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3