Реляционные базы данных не имеют простого способа сопоставить иерархии классов с таблицами базы данных.
Для решения этой проблемы в спецификации JPA предусмотрено несколько стратегий:
MappedSuperclass - родительские классы, могут'быть объектами
Одиночная таблица - объекты из разных классов с общим предком помещаются в одну таблицу
Объединенная таблица - каждый класс имеет свою таблицу, и для запроса объекта подкласса требуется присоединение ктаблицы
Table-Per-Class - все свойства класса находятся в его таблице, поэтому объединение не требуется
Каждая стратегия приводит к разной структуре базы данных.
Наследование сущностей означает, что мы можем использовать полиморфные запросы для извлечения всех сущностей подкласса при запросе суперкласса.
Поскольку Hibernate является реализацией JPA, он содержит все вышеперечисленное, а также несколькоОсобенности, связанные с Hibernate, связанные с наследованием.
MappedSuperclass: -
При использовании стратегии MappedSuperclass наследование проявляется только в классе, но не в модели сущностей.
Начнем с создания класса Person, который будет представлять родительский класс:
@MappedSuperclass
public class Person {
@Id
private long personId;
private String name;
// constructor, getters, setters
} Обратите внимание, что у этого класса больше нет аннотации @Entity, поскольку он не будет сохранен в базе данных сам по себе.
Далее, давайте добавим подкласс Employee:
@Entity
public class MyEmployee extends Person {
private String company;
// constructor, getters, setters
}
В базе данных это будет соответствовать одной таблице «MyEmployee» с тремя столбцами для объявленных и унаследованных полей подкласса.
Если мы используем эту стратегию, предки не могут содержать ассоциации с другими объектами.
Для получения более подробной информации см. -
https://ritesh -shukla.blogspot.com / 2018/10 / hibernate-наследование-mapping.html? M = 1