根据 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 指南。