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 wykrywa klasy Embeddable, które zawierają atrybuty z adnotacją Id, a następnie reguła flaguje adnotacje Id w zależności od tego, czy znajdzie jednostkę, która odwołuje się do osadzalnej klasy przy użyciu adnotacji EmbeddedId adnotacji.

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 klasa publiczna EmbeddableObject {

      Pole @Id private int

      ... }

Aby rozwiązać ten problem, należy usunąć 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.