嵌入类必须注释为可嵌入

根据 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 公用 类 EmbeddedEntity {

      @Id private int 标识;

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

   @Entity 公用类 EmbeddableEntity { private int embedField;

      ...}

为了解决该问题,手动检查 EmbeddableEntity 类的使用情况以验证它是否还用作实体类,以便您可以将 @Entity 注释更改为 @Embeddable

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

   @Entity 公用 类 EmbeddedEntity {

      @Id private int 标识;

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

   @Embedable 公用类 EmbeddableEntity { private int 字段;

      ...}

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