As classes integráveis não podem ter uma anotação de ID quando referenciadas por uma anotação EmbeddedId

De acordo com a especificação API de Persistência Java (JPA), se uma entidade define um atributo com uma anotação EmbeddedId, a classe integrável não pode conter um atributo com uma anotação Id. Se ambas as anotações EmbeddedId e Id forem definidas, o OpenJPA ignora a anotação Id, enquanto o EclipseLink lança uma exceção.

Esta regra faz a varredura para encontrar as classes Embeddable que contêm atributos com uma anotação Id, então, a regra sinaliza as anotações Id dependendo de ela localizar uma entidade que referencia a classe integrável usando uma anotação EmbeddedId.

Neste exemplo, a regra sinaliza a anotação Id na 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;

      ...
   }

Para resolver o problema, a correção rápida remove a anotação @Id e suaimport.

   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;

      ...
   }

Para obter informações sobre esse problema e outros problemas de migração do OpenJPA para o EclipseLink, consulte o guia Migração do OpenJPA para o EclipseLink JPA: mapeamentos.