Selon la spécification JPA (Java Persistence API), si une entité imbrique une classe à
l'aide d'une annotation Embedded, la classe imbriquable doit être annotée
avec une annotation Embeddable, et non avec une annotation Entity.
Dans OpenJPA, lorsqu'un attribut est assorti de l'annotation @Embedded, mais que la classe de référence est assortie de l'annotation @Entity au lieu de l'annotation @Embeddable, OpenJPA traite cette classe comme un élément imbriquable en imbriquant cette classe dans d'autres entités et en traitant cette classe comme une entité en créant une table pour la classe.
EclipseLink génère une exception dans ces conditions, car une classe peut être une entité ou un élément imbriquable.
Cette règle recherche les annotations @Embedded référençant des classes annotées avec @Entity. Elle règle marque les annotations selon la portée de l'analyse, si toutes les classes liées sont trouvées.
Embedded fait référence à une classe assortie d'une annotation Entity, la règle marque l'annotation Entity dans la classe référencée.
La correctif de ce cas dépend de l'utilisation ou non par l'application de cette classe comme entité ou comme élément imbriquable.
@Entity en @Embeddable.@Embedded et supprimez l'annotation @Embedded.
Embedded se trouve dans un attribut dans lequel la classe ne se trouve pas dans la portée de l'analyse et ne peut pas être vérifiée, l'annotation Embedded est marquée.
Vous pouvez développer la portée pour inclure
des classes supplémentaires et réexécuter l'analyse. Vous pouvez également vérifier
manuellement que la classe imbriquable est correctement annotée.
Dans cet exemple, la règle marque l'annotation @Entity dans la classe EmbeddableEntity.
import javax.persistence.EmbeddedId; import javax.persistence.Entity; @Entity public classe EmbeddedEntity { @Id ID int privé ; @Embedded private EmbeddableEntity ee ; }
import javax.persistence.Entity; @Entity classe publique EmbeddableEntity { private int embedField; ... }
Pour résoudre le problème, inspectez manuellement l'utilisation de la classe EmbeddableEntity afin de vérifier que celle-ci n'est pas également employée par une classe entité pour que vous puissiez remplacer l'annotation @Entity par @Embeddable.
import javax.persistence.Embeddable; import javax.persistence.Id; @Entity public classe EmbeddedEntity { @Id ID int privé ; @Embedded private EmbeddableEntity ee ; }
import javax.persistence.Embeddable; @Embeddable classe publique EmbeddableEntity { 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.