Clasele ce pot fi înglobate nu pot avea o adnotare ID diferită când sunt referite de o adnotare EmbeddedId

Conform specificaţiei Java Persistence API (JPA), dacă o entitate defineşte un atribut cu o adnotare EmbeddedId, clasa înglobabilă nu poate conţine un atribut cu o adnotare Id. Dacă sunt definite ambele adnotări, EmbeddedId şi Id, OpenJPA ignoră adnotarea Id, întrucât EclipseLink aruncă o excepţie.

Această regulă scanează pentru clasele Embeddable care conţin atribute cu o adnotare Id, apoi regula semnalează adnotările Id dacă găseşte o entitate care face referire la o clasă înglobabilă utilizând o adnotare EmbeddedId.

În acest exemplu, regula semnalează adnotarea Id din clasa 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;

      ...
   }

Pentru a rezolva problema, corecţia rapidă înlătură adnotarea @Id şi import a sa.

   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;

      ...
   }

Pentru informaţii despre această problemă şi alte probleme legate de migrarea OpenJPA la EclipseLink, vedeţi ghidul OpenJPA to EclipseLink JPA Migration: Mappings.