嵌入类必须注释为可嵌入

根据 Java 持久性 API (JPA) 规范,如果实体使用 Embedded 注释嵌入了类,那么嵌入式类必须通过 Embeddable 注释而不是 Entity 注释来进行注解。在 OpenJPA 中,当使用 @Embedded 注释来对属性进行注解,但使用 @Entity 注释(而不是 @Embeddable 注释)来对被引用类进行注解时,OpenJPA 会通过将此类嵌入其他实体来将此类视为可嵌入类,以及通过为此类创建表来将此类视为实体。 EclipseLink 在这些情况下会抛出异常,因为类可以是实体或可嵌入类。

该规则扫描引用通过 @Entity 进行注解的类的 @Embedded 注释。规则根据扫描范围和是否发现所有相关类来标记注释。

在该示例中,规则标记 EmbeddableEntity 类中的 @Entity 注释。

   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;

      ...
   }

为了解决该问题,手动检查 EmbeddableEntity 类的使用情况以验证它是否还用作实体类,以便您可以将 @Entity 注释更改为 @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;

      ...
   }

有关此问题和其他 OpenJPA 到 EclipseLink 迁移问题的信息,请参阅 OpenJPA to EclipseLink JPA Migration: Mappings 指南。