可內嵌類別由 EmbeddedId 註釋參照時,不能有 Id 註釋

根據「Java 持續性 API (JPA)」規格,如果實體定義的屬性具有 EmbeddedId 註釋,則可內嵌類別不能包含具有 Id 註釋的屬性。如果同時定義了 EmbeddedId 註釋和 Id 註釋,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 至 EclipseLink JPA 移轉:對映手冊。