Le classi incorporabili non possono avere un'annotazione Id quando vi fa riferimento un'annotazione EmbeddedId

Secondo la specifica JPA (Java Persistence API), se un'entità definisce un attributo con un'annotazione EmbeddedId, la classe incorporabile non può contenere un attributo con un'annotazione Id. Se sono definite sia l'annotazione EmbeddedId che quella Id, OpenJPA ignora l'annotazione Id, mentre EclipseLink genera un'eccezione.

Questa regola ricerca le classi Embeddable che contengono attributi con un'annotazione Id, quind i la regola contrassegna le annotazioni Id a seconda che trovi un'entità che fa riferimento alla classe incorporabile che utilizza l'annotazione EmbeddedId.

In questo esempio, la regola contrassegna l'annotazione Id nella 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;

      ...
   }

Per risolvere il problema, la correzione rapida rimuove l'annotazione @Id ed il relativo import.

   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;

      ...
   }

Per informazioni su questo problema e altri problemi della migrazione da OpenJPA a EclipseLink, consultare la guida OpenJPA to EclipseLink JPA Migration: Mappings.