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