jpa
Stratégie d'héritage joint
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.
@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.
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