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.
Embedded odwołuje się do klasy, która ma adnotację Entity, reguła oznacza adnotację Entity w przywoływanej klasie.
Poprawka dla tego przypadku zależy od tego, czy aplikacja używa tej klasy jako jednostki, czy jako klasy możliwej do osadzenia.
@Entity na adnotację @Embeddable.@Embedded, i usunąć adnotację @Embedded.
Embedded znajduje się w atrybucie, w którym w zasięgu skanowania nie znaleziono klasy osadzonej i dlatego nie można jej zweryfikować, adnotacja Embedded zostaje oznaczona.
Można rozszerzyć zakres analizy, uwzględniając dodatkowe klasy, a następnie ponownie uruchomić skanowanie lub można ręcznie sprawdzić, czy klasa możliwa do osadzenia ma poprawną adnotację.
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.