Klasy możliwe do osadzenia nie mogą mieć adnotacji Id, jeśli odwołuje się do nich adnotacja EmbeddedId

Zgodnie ze specyfikacją interfejsu API Java Persistence (JPA), jeśli jednostka definiuje atrybut z adnotacją EmbeddedId, możliwa do osadzenia klasa nie może zawierać atrybutu z adnotacją Id. Jeśli zdefiniowano zarówno adnotację EmbeddedId, jak i adnotację Id, interfejs OpenJPA ignoruje adnotację Id, natomiast interfejs EclipseLink zgłasza wyjątek.

Ta reguła skanuje klasy Embeddable zawierające atrybuty z adnotacją Id, a następnie oznacza adnotację Id w zależności od tego, czy znajdzie jednostkę, która odwołuje się do możliwej do osadzenia klasy za pomocą adnotacji EmbeddedId.

W tym przykładzie reguła powoduje oznaczenie adnotacji Id w klasie 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;

      ...
   }

W celu rozwiązania tego problemu szybka poprawka usuwa adnotację @Id i jej 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;

      ...
   }

Informacje na ten temat oraz na temat innych problemów z migracją interfejsu OpenJPA do interfejsu EclipseLink zawiera podręcznik Migracja interfejsu JPA ze środowiska OpenJPA do EclipseLink: Odwzorowania.