Задача
У меня есть @MappedSuperclass
с именем Data в качестве родителя для каждого объекта в моей базе данных. Он содержит общие атрибуты, такие как Id и т. Д. Затем у меня есть объект, расширяющий Data, который также является @MappedSuperclass
из-за общей функциональности его подклассов. Отображение в моей базе данных правильное.
Вот пример моей иерархии
@MappedSuperclass
Data
| @MappedSuperclass
+- Employee
| | @Entity
| +- FullTimeEmployee
| | @Entity
| +- PartTimeEmployee
| @Entity
+- Store
И таблицы правильно отображаются:
FullTimeEmployee
PartTimeEmployee
Store
В любом случае можно ли запрашивать базу данных для всех подклассов Employee (FullTimeEmployee, PartTimeEmployee) в качестве экземпляров Employee без ссылки на имя подклассов в запросе?
Что-то вроде
List<Employee> allEmployees = getAllEmployees();
Идея состоит в том, что всякий раз, когда я решу создать еще один подкласс Employee (т.е. AllDayEmployee), мне не придется изменять запрос, чтобы включить имя.
Решение
Итак, как правильно указал Грегори , это невозможно с @MappedSuperclass
. Поэтому я изменил его на @Entity и, поскольку я хотел сохранить таблицу для каждого подкласса, я использовал InheritanceType.JOINED
.
Итак, вышеприведенная иерархия теперь
@MappedSuperclass
Data
| @Entity
| @Inheritance(strategy=InheritanceType.JOINED)
+- Employee
| | @Entity
| +- FullTimeEmployee
| | @Entity
| +- PartTimeEmployee
| @Entity
+- Store
И таблицы все еще:
FullTimeEmployee
PartTimeEmployee
Store
Итак, чтобы получить всех сотрудников, я просто звоню:
entityManager.createQuery("from Employee").getResultList();