Java Persistence API (JPA) 仕様により、エンティティーが Embedded アノテーションを使用してクラスを組み込む場合、組み込み可能クラスには Entity ではなく Embeddable のアノテーションが付けられている必要があります。
OpenJPA は、属性に @Embedded アノテーションが付けられているが、参照されるクラスに @Embeddable アノテーションではなく @Entity アノテーションが付いている場合、
このクラスを他のエンティティーに組み込むことによってこのクラスを組み込み可能として扱い、このクラスのテーブルを作成することによってこのクラスをエンティティーとしても扱います。
EclipseLink では、クラスはエンティティーであるか、組み込み可能であるかのいずれかなので、このような場合には例外がスローされます。
この規則は、@Entity アノテーションが付けられたクラスを参照する @Embedded アノテーションをスキャンします。この規則は、スキャンの有効範囲に応じて、関連するすべてのクラスが見つかった場合にアノテーションにフラグを立てます。
Embedded アノテーションが、Entity アノテーションが付いたクラスを参照している場合、この規則は、参照されているクラス内の Entity アノテーションにフラグを立てます。
このケースに対するフィックスは、アプリケーションがこのクラスをエンティティーとして使用しているのか、それとも組み込み可能として使用しているのかに基づきます。
@Entity アノテーションを @Embeddable アノテーションに手動で変更します。@Embedded アノテーションを使用してこのクラスを組み込むすべてのエンティティーを見つけて、@Embedded アノテーションを削除します。
Embedded アノテーションが付けられていて、組み込まれるクラスがスキャンの有効範囲内で見つからないため検証できない場合、この 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 ガイドを参照してください。