Problème
J'ai un @MappedSuperclass
appelé Data en tant que parent de chaque entité dans ma base de données. Il contient des attributs communs comme Id etc. J'ai alors une entité qui étend les données qui est également un @MappedSuperclass
en raison de la fonctionnalité commune de ses sous-classes. Le mappage dans ma base de données est correct.Sélection MappedSuperclass de la base de données (Hibernate)
Voici un exemple de ma hiérarchie
@MappedSuperclass Data | @MappedSuperclass +- Employee | | @Entity | +- FullTimeEmployee | | @Entity | +- PartTimeEmployee | @Entity +- Store
Les tables sont correctement mis en correspondance:
FullTimeEmployee PartTimeEmployee Store
Y at-il de toute façon d'interroger la base de données pour toutes les sous-classes d'employés (FullTimeEmployee, PartTimeEmployee) comme des instances de l'employé sans faire référence au nom des sous-classes dans la requête?
Quelque chose comme
List<Employee> allEmployees = getAllEmployees();
L'idée est que chaque fois que je décide de créer une autre sous-classe des employés (à savoir AllDayEmployee) Je ne vais pas devoir changer la requête d'inclure le nom.
Solution
Ainsi, comme Gregory a souligné à juste titre, ce n'est pas possible avec @MappedSuperclass
. Je l'ai donc changé en @Entity et, comme je voulais conserver une table pour chaque sous-classe, j'ai utilisé InheritanceType.JOINED
.
donc la hiérarchie ci-dessus est maintenant
@MappedSuperclass Data | @Entity | @Inheritance(strategy=InheritanceType.JOINED) +- Employee | | @Entity | +- FullTimeEmployee | | @Entity | +- PartTimeEmployee | @Entity +- Store
Et les tables sont encore:
FullTimeEmployee PartTimeEmployee Store
Alors maintenant, pour obtenir tous les employés que j'appelle simplement:
entityManager.createQuery("from Employee").getResultList();
si je besoin de deux différents '@ SequenceGenerator' pour FullTimeEmployee et PartTimeEmployee (j'utilise Oracle séquences)? En tant qu'entité, je dois spécifier '@ Id' sur la classe Employee. – drakyoko