Recherche…


Paramètres

Annotation Objectif
@Héritage Spécifie le type de stratégie d'héritage utilisé
@DiscriminatorColumn Spécifie une colonne dans la base de données qui sera utilisée pour identifier différentes entités en fonction de certains identifiants attribués à chaque entité
@MappedSuperClass Les super-classes mappées ne sont pas persistantes et ne sont utilisées que pour maintenir l'état de ses sous-classes. Les classes Java généralement abstraites sont marquées avec @MapperSuperClass

Stratégie d'héritage jointe

Un exemple de diagramme de classes sur lequel nous verrons l'implémentation de JPA. entrer la description de l'image ici

@Entity
@Table(name = "VEHICLE")
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name = "VEHICLE_TYPE")
public abstract class Vehicle {

    @TableGenerator(name = "VEHICLE_GEN", table = "ID_GEN", pkColumnName = "GEN_NAME", valueColumnName = "GEN_VAL", allocationSize = 1)
    @Id
    @GeneratedValue(strategy = GenerationType.TABLE, generator = "VEHICLE_GEN")
    private int idVehicle;
    private String manufacturer;

    // getters and setters
}

TransportationVehicle.java

@MappedSuperclass
public abstract class TransportationVehicle extends Vehicle {

    private int loadCapacity;

    // getters and setters    
}

Truck.java

@Entity
public class Truck extends TransportationVehicle {

    private int noOfContainers;

    // getters and setters

}

PassengerVehicle.java

@MappedSuperclass
public abstract class PassengerVehicle extends Vehicle {

    private int noOfpassengers;

    // getters and setters
}

Car.java

@Entity
public class Car extends PassengerVehicle {

    private int noOfDoors;

    // getters and setters    
}

Bike.java

@Entity
public class Bike extends PassengerVehicle {

    private int saddleHeight;

    // getters and setters

}

Code de test

/* Create EntityManagerFactory */
EntityManagerFactory emf = Persistence
        .createEntityManagerFactory("AdvancedMapping");

/* Create EntityManager */
EntityManager em = emf.createEntityManager();
EntityTransaction transaction = em.getTransaction();

transaction.begin();

Bike cbr1000rr = new Bike();
cbr1000rr.setManufacturer("honda");
cbr1000rr.setNoOfpassengers(1);
cbr1000rr.setSaddleHeight(30);
em.persist(cbr1000rr);

Car aventador = new Car();
aventador.setManufacturer("lamborghini");
aventador.setNoOfDoors(2);
aventador.setNoOfpassengers(2);
em.persist(aventador);

Truck truck = new Truck();
truck.setLoadCapacity(1000);
truck.setManufacturer("volvo");
truck.setNoOfContainers(2);
em.persist(truck);

transaction.commit();

Le schéma de base de données serait comme ci-dessous. entrer la description de l'image ici

L'avantage de la stratégie d'héritage jointe est qu'elle ne gaspille pas l'espace de la base de données comme dans une stratégie à table unique. D'autre part, en raison des multiples jointures impliquées pour chaque insertion et récupération, les performances deviennent un problème lorsque les hiérarchies d'héritage deviennent larges et profondes.

Un exemple complet avec explication peut être lu ici



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow