Conform specificaţiei Java Persistence API (JPA), dacă o entitate înglobează o clasă
folosind o adnotare Embedded, clasa înglobabilă trebuie să fie adnotată cu o adnotare
Embeddable , nu o adnotare Entity .
Înn OpenJPA, când un atribut este adnotat cu o adnotare @Embedded
dar clasa la care se face referire este adnotată cu o adnotare @Entity în locul unei adnotări @Embeddable,
OpenJPA tratează această clasă ca una înglobabilă, prin înglobarea ei în alte entităţi,
şi, în acelaşi timp, o tratează ca o entitate prin crearea unui tabel pentru clasă.
EclipseLink aruncă o excepţie în aceste circumstanţe,
deoarece o clasă poate fi sau o entitate sau o clasă înglobabilă.
Această regulă scanează pentru adnotări @Embedded care fac referinţă la clasele
care sunt adnotate cu @Entity. Regula semnalează
adnotările în funcţie de domeniul de scanare şi dacă toate clasele înrudite sunt găsite.
Embedded face referinţă la o clasă care are o adnotare Entity,
regula semnalează adnotarea Entity în clasa referită.
Corecţia pentru acest caz depinde de utilizarea acestei clase de către aplicaţie ca o entitate sau ca o clasă înglobabilă.
@Entity la o adnotare @Embeddable.@Embedded şi înlăturaţi adnotarea @Embedded.
Embedded este pe un atribut unde clasa înglobată nu este găsită în cadrul domeniului
de scanare şi nu poate fi verificat, adnotarea Embedded
este semnalată.
Puteţi să extindeţi domeniul de analiză pentru a include clase suplimentare şi să rulaţi din nou scanarea
sau puteţi să verificaţi manual faptul că clasa înglobabilă este corect adnotată.
În acest exemplu, regula semnalează adnotarea @Entity din clasa EmbeddableEntity.
import javax.persistence.EmbeddedId; import javax.persistence.Entity; @Entity public class EmbeddedEntity { @Id int privat id; @Embedded privat EmbeddableEntity ee; }
import javax.persistence.Entity; @Entity clasă publică EmbeddableEntity { int privat embedField; ... }
Pentru a rezolva problema, inspectaţi manual utilizarea clasei EmbeddableEntity
pentru a verifica faptul că nu este, de asemenea, utilizată ca o clasă entitate pentru ca să puteţi
modifica adnotarea @Entity la @Embeddable.
import javax.persistence.Embeddable; import javax.persistence.Id; @Entity public class EmbeddedEntity { @Id int privat id; @Embedded privat EmbeddableEntity ee; }
import javax.persistence.Embeddable; @Embeddable clasă publică EmbeddableEntity { int privat 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.