Je développe une application dans laquelle tous les pojos sont exposés en tant qu'interface, mais nous mappons la classe de mise en œuvre réelle.Nous utilisez l'annotation Spring et JPA.Je suis sur le point de tester la relation unique et je suis avoir un problème de lumière avec l'interface.
causée par: org.springframework.beans.Factory.BeancreationException: erreur Création de haricot avec nom "SessionContainer" définie dans la ressource de chemin de classe [Meta-Inf / Model-config.xml]:
Ne peut pas résoudre la référence à la "SéanceFactory" de Bean lors de la définition de l'argument du constructeur; Exception imbriquée est org.springframework.beans.Factory.BeancreationException:
Erreur lors de la création de bean avec le nom "SéanceFactory" défini dans la ressource de chemin de classe [Meta-Inf / Model-config.xml]:
L'invocation de la méthode init a échoué; Exception imbriquée est org.hibernate.AnnotationException:
@Eonetoone ou @manytoone sur com.mycompany.project.subproject.model.useraccountmpl.profile références une entité inconnue: com.mycompany.project. P> blockQuote>Donc avant que cette classe, toutes les autres classes mappées fonctionnent comme prévu, donc je ne posterai que la partie du fichier
ApplicationContext code> que j'ai nommé
modèle-config.xml P>
//UserAccountImpl Class @Entity @Table(name ="USER_ACCOUNT") public class UserAccountImpl implements UserAccount { @Id @GeneratedValue @Column(name="USER_ACCOUNT_ID") private Long ID; ... @OneToOne @JoinColumn(name="USER_PROFILE_ID") private UserProfile profile; ... } //UserProfileImpl class @Entity @Table(name="USER_PROFILE") public class UserProfileImpl implements UserProfile { @Id @GeneratedValue @Column(name="USER_PROFILE_ID") private Long ID; .... @OneToOne(mappedBy="profile") private UserAccount userAccount; .... }
3 Réponses :
Vous avez ces options: p>
Vous devez dire à Hibernate de quelque manière que ce soit, quelle classe utiliser pour l'interface Vous pouvez utiliser Vous pouvez mapper le champ avec un userAccount code>. Actuellement, la solution la plus simple consiste à utiliser un type concret au lieu de l'interface de votre
userprofileImpl code>. P> li>
@target code> pour spécifier la mise en œuvre à utiliser (voir [Les docs] [1]). P> LI>
USERType code>. Cela permet de choisir la cartographie (quelle implémentation à utiliser pour une interface) au moment de l'exécution, mais vous devez écrire le code pour copier les champs entre vos objets métier et votre DB vous-même (pas de mappage automatique). P> LI>
ol>
Vous pouvez essayer ce qui suit:
@OneToOne(mappedBy="profile", targetEntity=UserAccountImpl.class) private UserAccount userAccount
L'userProfile doit-il être une entité distincte? Vous pouvez modéliser cela en tant que composant et combiner les tables userAccount et UserProfile en un. Votre modèle d'objet aurait toujours un objet UserProfile distinct, il s'agirait simplement d'un objet de valeur détenu par UserAccount. P>
Tous les objets doivent être mis en œuvre comme une entité, et des mappages en tête-à-tête sont assez rares dans la pratique ... P>
MMMH sonne très bien ici. Mais je ne vais pas vraiment accepter (je veux dire que je vais devoir lire) avec un composant. Je vais donc regarder dans le prochain jalon peut-être .Mais votre solution est cool pour moi.Merci
Pourriez-vous élaborer pourquoi vous utilisez des interfaces sur Pojos?
Hibernate ne peut pas éventuellement savoir quelle classe vous avez besoin d'implements
userAccount code>.