De acuerdo con la especificación JPA (Java Persistence API), si una entidad incorpora una clase utilizando una anotación Embedded, la clases incorporable se debe anotar con una anotación Embeddable, no una anotación Entity.
En OpenJPA, cuando un atributo se anota con la anotación @Embedded, pero la clase referenciada se anota con una anotación @Entity en lugar de una anotación @Embeddable, OpenJPA trata esta clase como incorporable incorporando esta clase en otras entidades así como tratando esta clase como una entidad creando una tabla para la clase.
En estas circunstancias EclipseLink emite una excepción, ya que una clase puede ser una entidad o una clase incorporable.
Esta regla busca anotaciones @Embedded que hagan referencia a clases que están anotadas con @Entity. La regla señala las anotaciones en función del ámbito de la búsqueda y si se encuentran todas las clases relacionadas.
Embedded hace referencia a una clase que tiene una anotación Entity, la regla señala la anotación Entity en la clase referenciada.
El arreglo para este caso depende de si la aplicación utiliza esta clase como una entidad o como una clase incorporable.
@Entity a una anotación @Embeddable.@Embedded y elimine la anotación @Embedded.
Embedded se encuentra en un atributo donde la clase incorporada no se encuentra dentro del ámbito de la exploración y no se puede verificar, la anotación Embedded se marcará.
Puede ampliar el ámbito del análisis para incluir clases adicionales y volver a ejecutar la búsqueda, o puede verificar manualmente que la clase incorporable se ha anotado correctamente.
En este ejemplo, la regla señala la anotación @Entity en la clase EmbeddableEntity.
import javax.persistence.EmbeddedId; import javax.persistence.Entity; @Entity public class EmbeddedEntity { @Id private int id; @Embedded private EmbeddableEntity ee;}
import javax.persistence.Entity; @Entity clase pública EmbeddableEntity { private int embedField; ...}
Para resolver el problema, examine manualmente el uso de la clase EmbeddableEntity para verificar que no se utiliza también como clase de entidad, de forma que puede cambiar la anotación @Entity a @Embeddable.
import javax.persistence.Embeddable; importar javax.persistence.Id; @Entity public class EmbeddedEntity { @Id private int id; @Embedded private EmbeddableEntity ee;}
import javax.persistence.Embeddable; @Embeddable clase pública EmbeddableEntity { private int campo; ...}
Si desea más información sobre este problema y otros problemas de migración de OpenJPA a EclipseLink, consulte la guía Migración de OpenJPA a EclipseLink JPA: Correlaciones.