По умолчанию JPA использует SINGLE_TABLE: одна таблица для всей иерархии с полями attr1–attr4, идентификатором и discriminator. Для корректной модели также нужен @Id у корня.
Отображение наследования классов в таблицах БД
По умолчанию JPA использует SINGLE_TABLE: одна таблица для всей иерархии с полями attr1–attr4, идентификатором и discriminator. Для корректной модели также нужен @Id у корня.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
В системе присутствует иерархия сущностей, отмеченных аннотацией @Entity. Нужно определить, какие таблицы будет сформировать база данных при применении стратегии наследования, используемой по умолчанию в JPA. Какие именно таблицы и столбцы появятся? Как реализуется механизм наследования по умолчанию? Затем изменить стратегию наследования и описать различия между вариантами.
@Entity
class User { int attr1; /* ... */ }
@Entity
class Customer extends User { int attr2; /* ... */ }
@Entity
class Employee extends User { int attr3; /* ... */ }
@Entity
class Admin extends Employee { int attr4; /* ... */ }
Ответ
По умолчанию JPA использует SINGLE_TABLE: одна таблица для всей иерархии с полями attr1–attr4, идентификатором и discriminator. Для корректной модели также нужен @Id у корня.
Схематично SINGLE_TABLE хранит подтипы в одной строке, ненужные поля подтипов остаются NULL. JOINED создаёт User(id,attr1), Customer(id,attr2), Employee(id,attr3), Admin(id,attr4); чтение Admin соединяет его с Employee и User. TABLE_PER_CLASS хранит отдельные таблицы конкретных типов с унаследованными полями, например Admin(id,attr1,attr3,attr4). Стратегию задают @Inheritance на User. Фактические имена зависят от mapping и naming strategy; таблицы создаются лишь при включённой генерации схемы или миграции.
Источник: jakarta.ee, jakarta.ee.