Maison  >  Article  >  Java  >  Comprendre @MappedSuperclass dans JPA

Comprendre @MappedSuperclass dans JPA

PHPz
PHPzoriginal
2024-08-25 18:00:361084parcourir

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 dans 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 possède 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 Moto hérite également des attributs de la classe Véhicule.
  • Il est annoté avec @Entity et mappé à une table appelée moto.

Mappage des tables

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

  1. Tableau de 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 @MappedSuperclass

  • Centralisation des identifiants : Le champ id est géré dans la superclasse. Toutes les entités dérivées du 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 pu 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.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Article précédent:Récursion -1Article suivant:Récursion -1