@MappedSuperclass n'est pas un @Entité JPA?
Donc je suis en utilisant DerbyDB et je suis à la configuration de certaines entités. J'ai un @MappedSuperclass
qui est utilisé comme une super-classe pour certaines entités (@Entity
). Plus précisément, j'ai une super-classe User
et 3 sous-classes, à savoir admin
, regular
et guest
. Maintenant, j'ai une autre entité, disons file
qui devrait de référence (comme l'un de ses champs) à son propriétaire. J'ai donc créé un champ appelé User owner
.
L'erreur que j'obtiens est:
Exception Description: [File] uses a non-entity [User] as target entity in the relationship attribute [field owner].
Est-il une solution?
- Votre erreur est clairement spécifiques selon implémentation JPA vous utilisez (et vous n'avez pas de nous dire laquelle). Mon fournisseur JPA permet l'utilisation de MappedSuperclass dans les relations.
- ce JPA-fournisseur autorise l'utilisation de MappedSuperclass comme une entité? que de la documentation d'oracle: "Mappé super-classes ne peuvent pas être interrogés et ne peut pas être utilisé dans l'EntityManager ou les opérations de Requête."
- DataNucleus JPA ne IIRC, et tout JPA vendeur peut offrir leurs propres extensions à l' (limitée) spécification JPA (comme d'autres le font dans d'autres domaines).
- thx pour l'info, je n'ai travaillé avec EclipseLink et mise en veille prolongée jusqu'à présent, qui ne permettent pas à une MappedSuperclass être une entité
Vous devez vous connecter pour publier un commentaire.
Je peux vous proposer deux solutions:
Modifier L'Héritage
L'exception que vous obtenez décrit clairement votre problème:
User
n'est pas une entité. Toute la classe a déclaré en tant que super-classe avec l'interface@MappedSuperclass
ne peut pas être une entité (dans la norme JPA - dépend de votre JPA-fournisseur)... permettez-moi de vous une réponse que je viens de donner à tout un problème similaire--> Super-Classe-Types
Donc de la définition de votre super-classe comme une entité abstraite vous donnera le comportement souhaité, vous l'avez décrit.
Supplémentaires:
Si vous choisissez votre mappage de l'héritage de stratégie
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
vous n'avez même pas besoin de base de données multiples-tables. Voici un bon exemple: JPA Unique de l'Héritage de TableChanger de Modèle (suggéré)
Ne pas séparer l'utilisateur de votre entité en plusieurs entités par leurs rôles. Faire un
Enum
avec tous vos rôles souhaités et ajoutez un champ à votreUser
-entité. C'est largement plus commun, à moins que u besoin de votre admin, invités, etc pour être un objet...Comme je l'ai expliqué dans cet article,
@MappedSupperclass
est différente de la@Inheritance
annotation.@MappedSuperclass
raconte la JPA fournisseur d'inclure la classe de base propriétés persistantes, comme si elles étaient déclarées par les enfants de la classe de l'extension de la super-classe annotée avec@MappedSuperclass
.Cependant, l'héritage n'est visible que dans le monde de la programmation orientée objet, depuis, à partir d'une base de données de point de vue, il n'y a aucune indication de la classe de base. Seuls les enfants de la classe de l'entité seront associées mappé table.
La
@Inheritance
annotation est destinée à concrétiser la POO modèle d'héritage dans la table de base de données de la structure. De plus, vous pouvez interroger une base de classe annotée avec@Inheritance
mais vous ne pouvez pas le faire pour une classe de base annotée avec@MappedSuperclass
.