Selon la spécification JPA (Java Persistence API), si une entité définit un attribut avec
une annotation EmbeddedId, la classe imbriquable ne peut pas contenir
d'attribut déclaré avec une annotation Id. Si les annotations EmbeddedId et Id sont définies, OpenJPA ignore l'annotation Id, alors qu'EclipseLink génère une exception.
Cette règle détecte les classes intégrables qui contiennent des attributs avec une annotation Id, puis la règle marque les annotations Id selon qu'elle trouve ou non une entité référençant la classe intégrable à l'aide d'une annotation EmbeddedId à l'aide d'une annotation
EmbeddedId référence une classe imbriquable comportant une annotation Id, la règle marque l'annotation Id comme problème grave. L'annotation Id devra être supprimée.
EmbeddedId, elle marque le problème comme avertissement. Vous pouvez développer la portée pour inclure les attributs annotés avec
EmbeddedId qui peuvent référencer la classe imbriquable, puis réexécuter
l'analyse. Vous pouvez également vérifier manuellement que les annotations
EmbeddedId référencent la classe imbriquable.
Dans cet exemple, la règle marque l'annotation Id dans la classe EmbeddableObject.
import javax.persistence.EmbeddedId; import javax.persistence.Entity; @Entity public class MainEntity { @EmbeddedId privé EmbeddableObject eo ; }
import javax.persistence.Embeddable; import javax.persistence.Id; @Embeddable classe publique EmbeddableObject { @Id zone private int ; ... }
Pour résoudre le problème, supprimez l'annotation @Id et son importation.
import javax.persistence.Embeddable; import javax.persistence.Id; @Entity public classe MainEntity { @EmbeddedId privé EmbeddableObject eo ; }
import javax.persistence.Embeddable; @Embeddable classe publique EmbeddableObject { zone private int ; ... }
Pour des informations sur ce problème et d'autres problèmes de migration d'OpenJPA vers EclipseLink, voir le guide OpenJPA to EclipseLink JPA Migration: Mappings.