已內嵌的類別必須標註為可內嵌

根據「Java 持續性 API (JPA)」規格,如果實體使用 Embedded 註釋來內嵌類別,則可內嵌類別也必須以 Embeddable 註釋標註,而非以 Entity 註釋標註。 在 OpenJPA 中,如果屬性是以 @Embedded 註釋標註,但參照的類別是以 @Entity 註釋(而非 @Embeddable 註釋)標註,OpenJPA會將此類別視為可內嵌並將其內嵌在其他實體中,同時還會將此類別視為實體並為其建立表格。 在這些情況下,EclipseLink 會擲出異常狀況,因為類別可以是實體或可內嵌。

此規則會掃描是否有 @Embedded 註釋參照以 @Entity 標註的類別。該規則會根據掃描的範圍以及是否找到所有相關的類別來標示註釋。

在本例中,規則會標示 EmbeddableEntity 類別中的 @Entity 註釋。

   import javax.persistence.EmbeddedId; import javax.persistence.Entity;

   @Entity public class EmbeddedEntity {

      @Id private int id;

      @Embedded private EmbeddableEntity ee;}
   import javax.persistence.Entity;

   @Entity 公用類別 EmbeddableEntity { private int embedField;

      ...}

要解決此問題,請手動檢查所使用的 EmbeddableEntity 類別,驗證其並未同時作為實體類別,因此您可以將 @Entity 註釋變更為 @Embeddable

   import javax.persistence.Embeddable; import javax.persistence.Id;

   @Entity public class EmbeddedEntity {

      @Id private int id;

      @Embedded private EmbeddableEntity ee;}
   import javax.persistence.Embeddable;

   @Embeddable 公用類別 EmbeddableEntity { private int 欄位;

      ...}

如需此問題以及其他 OpenJPA 至 EclipseLink 移轉問題的相關資訊,請參閱 OpenJPA 至 EclipseLink JPA 移轉:對映手冊。