Podle specifikace JPA (Java Persistence API) platí, že pokud entita vkládá třídu pomocí anotace Embedded, musí být vložitelná třída anotována s anotací Embeddable, a nikoli anotací Entity.
V rozhraní OpenJPA platí, že pokud je atribut anotován s anotací @Embedded, ale odkazovaná třída je anotována s anotací @Entity namísto anotace @Embeddable, rozhraní OpenJPA považuje tuto třídu za vložitelnou vložením této třídy do jiných entit a ošetřením této třídy jako entity vytvořením tabulky pro danou třídu.
EclipseLink za těchto okolností generuje výjimku, dokud je třída třídou entity nebo vložitelnou.
Toto pravidlo prochází anotace @Embedded, které odkazují na třídy, které jsou anotovány pomocí @Entity. Pravidlo značí anotace v závislosti na rozsahu procházení a v případě, že jsou nalezeny všechny související třídy.
Embedded odkazuje na třídu, která obsahuje anotaci Entity, označí pravidlo anotaci Entity v odkazované třídě.
Oprava pro tento případ závisí na tom, zda aplikace používá tuto třídu jako třídu entity nebo vložitelnou.
@Entity na anotaci @Embeddable.@Embedded a odeberte anotaci @Embedded.
Embedded v atributu, kde vložená třída nebyla nalezena v rámci rozsahu skenování a nelze ji ověřit, je označena anotace Embedded.
Můžete rozšířit rozsah analýzy, aby zahrnoval další třídy, a znovu spustit skenování nebo můžete ručně ověřit, zda je vložitelná třída správně anotována.
V tomto příkladu pravidlo značí anotaci @Entity ve třídě EmbeddableEntity.
import javax.persistence.EmbeddedId; import javax.persistence.Entity; @Entity public třída EmbeddedEntity { @Id private int id; @Embedded private EmbeddableEntity ee;}
import javax.persistence.Entity; @Entity public class EmbeddableEntity { private int embedField; ...}
Chcete-li tento problém vyřešit, ručně zkontrolujte použití třídy EmbeddableEntity k ověření, že tento problém není také používán jako třída entity, takže můžete změnit anotaci @Entity na @Embeddable.
import javax.persistence.Embeddable; import javax.persistence.Id; @Entity public třída EmbeddedEntity { @Id private int id; @Embedded private EmbeddableEntity ee;}
import javax.persistence.Embeddable; @Embeddable public class EmbeddableEntity { private int pole; ...}
Informace o tomto problému a jiných problémech migrace OpenJPA na EclipseLink viz příručka Migrace OpenJPA na EclipseLink JPA: Mapování.