jpa
Dołączono do strategii dziedziczenia
Szukaj…
Parametry
| Adnotacja | Cel, powód |
|---|---|
| @Dziedzictwo | Określa typ zastosowanej strategii dziedziczenia |
| @DiscriminatorColumn | Określa kolumnę w bazie danych, która będzie używana do identyfikacji różnych jednostek na podstawie określonego identyfikatora przypisanego do każdej jednostki |
| @MappedSuperClass | odwzorowane superklasy nie są trwałe i są używane tylko do przechowywania stanu dla jego podklas. Ogólnie abstrakcyjne klasy Java są oznaczone @MapperSuperClass |
Połączona strategia dziedziczenia
Przykładowy diagram klas, na podstawie którego zobaczymy implementację 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
}
TransportVehicle.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
}
Kod testowy
/* 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();
Schemat bazy danych wyglądałby jak poniżej.
Zaletą połączonej strategii dziedziczenia jest to, że nie marnuje ona miejsca w bazie danych, jak w strategii pojedynczej tabeli. Z drugiej strony, ze względu na wiele połączeń dla każdego wstawiania i pobierania, wydajność staje się problemem, gdy hierarchie dziedziczenia stają się szerokie i głębokie.
Pełny przykład z wyjaśnieniem można przeczytać tutaj
Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow