組み込みクラスには組み込み可能のアノテーションを付ける必要がある

Java Persistence API (JPA) 仕様により、エンティティーが Embedded アノテーションを使用してクラスを組み込む場合、組み込み可能クラスには Entity ではなく Embeddable のアノテーションが付けられている必要があります。 OpenJPA は、属性に @Embedded アノテーションが付けられているが、参照されるクラスに @Embeddable アノテーションではなく @Entity アノテーションが付いている場合、 このクラスを他のエンティティーに組み込むことによってこのクラスを組み込み可能として扱い、このクラスのテーブルを作成することによってこのクラスをエンティティーとしても扱います。 EclipseLink では、クラスはエンティティーであるか、組み込み可能であるかのいずれかなので、このような場合には例外がスローされます。

この規則は、@Entity アノテーションが付けられたクラスを参照する @Embedded アノテーションをスキャンします。この規則は、スキャンの有効範囲に応じて、関連するすべてのクラスが見つかった場合にアノテーションにフラグを立てます。

以下の例では、この規則は EmbeddableEntity クラスの @Entity アノテーションにフラグを立てます。

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

   @Entity public クラス EmbeddedEntity {

      @Id private int ID;

      @Embedded プライベート EmbeddableEntity ee;}
   import javax.persistence.Entity;

   @Entity 公開クラス EmbeddableEntity { private int embedField;

      ...}

この問題を解決するため、EmbeddableEntity クラスの使用を手動で検査して、@Entity アノテーションを @Embeddable アノテーションに変更できるよう、このクラスがエンティティー・クラスとして使用されていないことを確認します。

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

   @Entity public クラス EmbeddedEntity {

      @Id private int ID;

      @Embedded プライベート EmbeddableEntity ee;}
   import javax.persistence.Embeddable;

   @Embeddable public class EmbeddableEntity { private int フィールド;

      ...}

この問題や、OpenJPA から EclipseLink へのマイグレーションに関するその他の問題については、 OpenJPA to EclipseLink JPA Migration: Mappings ガイドを参照してください。