EmbeddedId アノテーションによって参照されている場合は、組み込み可能クラスには Id アノテーションを付けられない

Java Persistence 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 to EclipseLink JPA Migration: Mappings ガイドを参照してください。