Osadzone klasy muszą mieć adnotację wskazującą, że są możliwe do osadzenia

Zgodnie ze specyfikacją interfejsu API Java Persistence (JPA), jeśli w jednostce osadzona jest klasa przy użyciu adnotacji Embedded, możliwa do osadzenia klasa musi mieć adnotację Embeddable, a nie Entity. W interfejsie OpenJPA, gdy atrybut ma adnotację @Embedded, ale przywoływana klasa jest oznaczona adnotacją @Entity, a nie adnotacją @Embeddable, interfejs OpenJPA traktuje tę klasę jako możliwą do osadzenia przez osadzenie w innych jednostkach, jak również traktuje tę klasę jako jednostkę, tworząc dla niej tabelę. W takich okolicznościach interfejs EclipseLink zgłasza wyjątek, ponieważ klasa może być albo jednostką, albo klasą możliwą do osadzenia.

Ta reguła skanuje adnotacje @Embedded odwołujące się do klas z adnotacją @Entity. Reguła oznacza adnotacje w zależności od zasięgu skanowania i gdy zostaną znalezione wszystkie powiązane klasy.

W tym przykładzie reguła powoduje oznaczenie adnotacji @Entity w klasie EmbeddableEntity.

   import javax.persistence.EmbeddedId; import javax.persistence.Entity;

   @Entity public class EmbeddedEntity {

      @Id private int id;

      @Embedded private EmbeddableEntity ee; }
   import javax.persistence.Entity;

   @Entity klasa publiczna EmbeddableEntity { private int embedField;

      ... }

Aby rozwiązać ten problem, należy ręcznie zbadać użycie klasy EmbeddableEntity, upewniając się, że nie jest ona używana jako jednostka i można zmienić adnotację @Entity na @Embeddable.

   import javax.persistence.Embeddable; import javax.persistence.Id;

   @Entity public class EmbeddedEntity {

      @Id private int id;

      @Embedded private EmbeddableEntity ee; }
   import javax.persistence.Embeddable;

   @Embeddable klasa publiczna EmbeddableEntity { private int pole;

      ... }

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.