Integrierbare Klassen dürfen keine ID-Annotation haben, wenn sie von einer Annotation EmbeddedId referenziert werden

Wenn eine Entität ein Attribut mit einer Annotation EmbeddedId definiert, darf die integrierbare Klasse entsprechend der JPA-Spezifikation (Java Persistence API) kein Attribut mit einer Annotation Id enthalten. Wenn sowohl die Annotation EmbeddedId als auch die Annotation Id definiert ist, ignoriert OpenJPA die Annotation Id, wohingegen EclipseLink eine Ausnahme auslöst.

Diese Regel sucht nach Embeddable-Klassen, die Attribute mit einer Id-Annotation enthalten, und markiert dann die Id-Annotationen abhängig davon, ob sie eine Entität findet, die die integrierbare Klasse mit einer Annotation EmbeddedId referenziert.

In diesem Beispiel markiert die Regel die Annotation Id in der Klasse EmbeddableObject.

   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;

      ...
   }

Zur Behebung des Problems entfernt die Schnellkorrektur die Annotation @Id und die zugehörige Anweisung 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;

      ...
   }

Informationen zu diesem Problem und zu weiteren Problemen bei der Migration von OpenJPA auf EclipseLink finden Sie in der Veröffentlichung OpenJPA to EclipseLink JPA Migration: Mappings.