根据 Java 持久性 API (JPA) 规范,如果实体通过 EmbeddedId 注释定义属性,那么嵌入式类不能包含带有 Id 注释的属性。如果定义了 EmbeddedId 和 Id 注释,那么 OpenJPA 将忽略 Id 注释,而 EclipseLink 将抛出异常。
此规则检测包含带有 Id 注释的属性的可嵌入类,然后根据是否找到使用 EmbeddedId 注释引用可嵌入类的实体来标记 Id 注释。
EmbeddedId 注释引用了具有 Id 注释的嵌入式类,那么规则会将该 Id 注释标记为严重问题。 Id 注解 需要删除。
EmbeddedId 注释的实体的引用,那么规则会将问题标记为警告。 可扩展分析范围以包含通过可能引用该嵌入式类的 EmbeddedId 进行注释的任何属性,并重新运行扫描,或者可手动验证是否没有任何 EmbeddedId 注释引用该嵌入式类。
在该示例中,规则标记 EmbeddableObject 类中的 Id 注释。
import javax.persistence.EmbeddedId; import javax.persistence.Entity; @Entity 公用 类 MainEntity { @EmbeddedId private EmbeddableObject eo;}
import javax.persistence.Embeddable; import javax.persistence.Id; @Embedable public class EmbeddableObject { @Id private int 字段; ...}
要解决这个问题,请删除 @Id 注解及其导入。
import javax.persistence.Embeddable; import javax.persistence.Id; @Entity 公用 类 MainEntity { @EmbeddedId private EmbeddableObject eo;}
import javax.persistence.Embeddable; @Embedable 公用类 EmbeddableObject { private int 字段; ...}
有关此问题和其他 OpenJPA 到 EclipseLink 迁移问题的信息,请参阅 OpenJPA to EclipseLink JPA Migration: Mappings 指南。