根据 Java 持久性 API (JPA) 规范,如果实体使用 Embedded 注释嵌入了类,那么嵌入式类必须通过 Embeddable 注释而不是 Entity 注释来进行注解。在 OpenJPA 中,当使用 @Embedded 注释来对属性进行注解,但使用 @Entity 注释(而不是 @Embeddable 注释)来对被引用类进行注解时,OpenJPA 会通过将此类嵌入其他实体来将此类视为可嵌入类,以及通过为此类创建表来将此类视为实体。
EclipseLink 在这些情况下会抛出异常,因为类可以是实体或可嵌入类。
该规则扫描引用通过 @Entity 进行注解的类的 @Embedded 注释。规则根据扫描范围和是否发现所有相关类来标记注释。
Embedded 注释引用了具有 Entity 注释的类,那么此规则将在被引用类中标记 Entity 注释。
此情况的修复取决于应用程序是将此类用作实体还是可嵌入类。
@Entity 注释手动更改为 @Embeddable 注释。@Embedded 注释嵌入此类的所有实体并移除 @Embedded 注释。
Embedded 注释所在属性的嵌入类不在扫描范围内且无法进行验证,那么将标记 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 指南。