嵌入式类在由 EmbeddedId 注释引用时不能具有 Id 注释

根据 Java 持久性 API (JPA) 规范,如果实体通过 EmbeddedId 注释定义属性,那么嵌入式类不能包含带有 Id 注释的属性。如果定义了 EmbeddedIdId 注释,那么 OpenJPA 将忽略 Id 注释,而 EclipseLink 将抛出异常。

该规则扫描以查找包含带有 Id 注释的属性的 Embeddable 类,然后该规则将根据是否找到使用 EmbeddedId 注释来引用嵌入式类的实体,相应地标记 Id 注释。

在该示例中,规则标记 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 指南。