Vložené třídy musí být anotovány jako vložitelné

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.

V tomto příkladu pravidlo značí anotaci @Entity ve třídě 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
   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 class EmbeddedEntity {

      @Id
      private int id;

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

   @Embeddable
   public class EmbeddableEntity {

      private int field;

      ...
   }

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í.