Les classes imbriquables ne peuvent pas comporter d'annotation ID lorsqu'elles sont référencées par une annotation EmbeddedId

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.

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.