根據「Java 持續性 API (JPA)」規格,如果實體使用 Embedded 註釋來內嵌類別,則可內嵌類別也必須以 Embeddable 註釋標註,而非以 Entity 註釋標註。
在 OpenJPA 中,如果屬性是以 @Embedded 註釋標註,但參照的類別是以 @Entity 註釋(而非 @Embeddable 註釋)標註,OpenJPA會將此類別視為可內嵌並將其內嵌在其他實體中,同時還會將此類別視為實體並為其建立表格。
在這些情況下,EclipseLink 會擲出異常狀況,因為類別可以是實體或可內嵌。
此規則會掃描是否有 @Embedded 註釋參照以 @Entity 標註的類別。該規則會根據掃描的範圍以及是否找到所有相關的類別來標示註釋。
Embedded 註釋參照具有 Entity 註釋的類別,此規則會在參照的類別中標示 Entity 註釋。此情況的修正方法取決於應用程式將此類別用作實體還是可內嵌。
@Entity 註釋手動變更為 @Embeddable 註釋。@Embedded 註釋來內嵌此類別的所有實體,然後移除 @Embedded 註釋。
Embedded 註釋,但其內嵌類別在掃描範圍內找不到且無法驗證,則會標示 Embedded 註釋。
您可以擴充分析的範圍來併入更多類別,然後重新執行掃描;也可以手動驗證可內嵌類別是否正確標註。
在本例中,規則會標示 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 移轉:對映手冊。