Поиск…


параметры

аннотирование Цель
@Inheritance Указывает тип используемой стратегии наследования
@DiscriminatorColumn Задает столбец в базе данных, который будет использоваться для идентификации разных объектов на основе определенного идентификатора, назначенного каждому объекту
@MappedSuperClass сопоставленные суперклассы не являются постоянными и используются только для хранения состояния для своих подклассов. Обычно абстрактные классы Java помечены знаком @MapperSuperClass

Стратегия наследования

Пример диаграммы классов, на основе которой мы увидим реализацию 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

}

Тестовый код

/* 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();

Диаграмма базы данных будет выглядеть следующим образом. введите описание изображения здесь

Преимущество объединенной стратегии наследования заключается в том, что он не тратит пространство базы данных, как в стратегии с одной таблицей. С другой стороны, из-за множественных объединений, задействованных для каждой вставки и извлечения, производительность становится проблемой, когда иерархии наследования становятся широкими и глубокими.

Полный пример с объяснением можно прочитать здесь



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow