Erreur Eclipse lors du mappage avec @EmbeddedId

J’ai une entité avec une clé composite et j’utilise donc les annotations @Embeddable et @EmbeddedId. La classe intégrable ressemble à ceci:

@Embeddable public class DitaAdminAccountSkillPK implements Serializable { @ManyToOne @JoinColumn(name = "admin_id") private DitaAdmin admin; @ManyToOne @JoinColumn(name = "account_id") private DitaAccount account; //constructor, getters, setters... } 

Et l’entité qui l’utilise:

 @Entity public class DitaAdminAccountSkill { @EmbeddedId private DitaAdminAccountSkillPK id; //constructor, getters, setters... } 

Maintenant, je veux mapper l’entité dans une autre entité comme ceci:

 @OneToMany(fetch = FetchType.LAZY, mappedBy = "id.admin") private List accountSkills; 

Notez le mappedBy = “id.admin” qui fait référence au champ admin dans DitaAdminAccountSkillPK en utilisant le champ id de DitaAdminAccountSkill .

Cela comstack et fonctionne très bien. Toutefois, dans eclipse, une erreur s’affiche: Dans l’atsortingbut ‘accountSkills’, la valeur “mappée par” id ‘ad.min “ne peut pas être résolue en un atsortingbut de l’entité cible.

Notez qu’il s’agit d’un problème JPA, ce qui signifie que la facette JPA se plaint. Maintenant, je sais que je pourrais utiliser @IdClass à la place, mais je me demande simplement pourquoi cela semble-t-il être une erreur. Ou peut-être que je fais quelque chose de terriblement faux?

Selon la section 11.1.15 de la spécification JPA 2.0 : Les mappages de relations définis dans une classe id intégrée ne sont pas pris en charge. Toutefois, cela peut être pris en charge par l’implémentation JPA que vous utilisez, même si elle n’est pas officiellement prise en charge par la norme elle-même.

Si tel est le cas ici, vous pouvez désactiver la validation dans Eclipse sous Window -> Preferences -> Java Persistence -> JPA -> Errors/Warnings -> Atsortingbutes -> Cannot resolve atsortingbute name .

Dans mon cas, le problème n’a pas été résolu tant que je n’ai pas défini Ignore comme suit:

 Project Facets > JPA > Errors/Warnings > Type > Mapped Java Class is a member class 

Avant d’essayer l’une des solutions précédentes, vérifiez d’abord le persistence.xml et assurez-vous que soit exclude-unlisted-classes est défini sur true ou que toutes vos classes mappées sont répertoriées dans votre persistence-unit .

Je pensais publier la solution trouvée conforme à la spécification JPA 2.0 et semblant fonctionner de la même manière.

Tout d’abord, la spécification JPA 2.0 peut être trouvée ici: Spécification de persistance JSR-000317 pour Eval 2.0 Eval . La section pertinente serait 2.4.1 “Clés primaires correspondant aux identités dérivées”

Voici un exemple utilisant les classes que vous avez spécifiées:

Classe d’identifiant intégré:

 @Embeddable public class DitaAdminAccountSkillPK implements Serializable { //No further annotations are needed for the properties in the embedded Id. //Needs to match the type of the id of your DitaAdmin object. I added 'Id' to the end of the property name to be more explicit. //Making the assumption here that DitaAdmin has a simple Integer primary key. private Integer adminId; //Needs to match the type of the id of your DitaAccount object. I added 'Id' to the end of the property name to be more explicit. //Making the assumption here that DitaAccount has a simple Integer primary key. private Integer accountId; //I'm adding a third property to the primary key as an example private Ssortingng accountName; //constructor, getters, setters... //hashCode() and equals() overrides } 

Catégorie d’entité “dépendante”:

 @Entity public class DitaAdminAccountSkill { @EmbeddedId //Any overrides to simple Id properties should be handled with an atsortingbute override @AtsortingbuteOverride(name = "accountName", column = @Column(name = "account_name")) private DitaAdminAccountSkillPK id; //MapsId refers to the name of the property in the embedded Id @MapsId("adminId") @JoinColumn(name="admin_id") @ManyToOne private DitaAdmin admin; @MapsId("accountId") @JoinColumn(name="account_id") @ManyToOne private DitaAccount account; //constructor, getters, setters... } 

Classe d’entité “parent”:

 public class DitaAdmin { @Id private Integer id; //... //Now your mappedBy atsortingbute can refer to the admin object defined on DitaAdminAccountSkill which is also part of the Primary Key @OneToMany(fetch = FetchType.LAZY, mappedBy="admin") private List accountSkills; //... } 

Préférences -> Persistance Java -> JPA -> Erreurs / Avertissements -> Atsortingbut -> Les classes d’ID incorporées ne doivent pas contenir de mappages de relations: (Ignorer)