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 recherche les classes Embeddable qui contiennent des attributs
avec une annotation Id, puis elle marque les annotations Id si
elle trouve une entité référençant la classe imbriquable avec une annotation
EmbeddedId.
EmbeddedId référence une classe imbriquable comportant une annotation Id, la règle marque l'annotation Id comme problème grave. Vous pouvez utiliser le correctif rapide pour retirer l'annotation Id.
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 private EmbeddableObject eo; } |
import javax.persistence.Embeddable; import javax.persistence.Id; @Embeddable public class EmbeddableObject { @Id private int field; ... } |
Pour résoudre le problème, le correctif rapide retire l'annotation @Id et l'élément import associé.
import javax.persistence.Embeddable; import javax.persistence.Id; @Entity public class MainEntity { @EmbeddedId private EmbeddableObject eo; } |
import javax.persistence.Embeddable; @Embeddable public class EmbeddableObject { private int field; ... } |
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.