Wenn eine Entität eine Klasse mit einer Annotation Embedded
integriert, muss die integrierbare Klasse entsprechend der JPA-Spezifikation (Java Persistence API)
mit einer Annotation Embeddable und nicht mit einer Annotation Entity annotiert werden.
Wenn in OpenJPA ein Attribut mit der Annotation @Embedded annotiert ist, aber die referenzierte Klasse
mit einer Annotation @Entity und nicht mit einer Annotation @Embeddable, behandelt
OpenJPA diese Klasse als integrierbar, indem diese Klasse sowohl in andere Entitäten integriert wird, als auch wie eine Entität behandelt wird, indem eine Tabelle für die Klasse erstellt wird. EclipseLink löst unter diesen Umständen eine Ausnahme aus, da eine Klasse entweder eine Entität oder integrierbar sein kann.
Diese Regel sucht nach @Embedded-Annotationen, die mit
@Entity annotierte Klassen referenzieren. Die Regel markiert Annotationen in Abhängigkeit
vom Umfang des Scans und abhängig davon, ob alle zugehörigen Klassen gefunden werden.
Embedded eine Klasse referenziert, die eine Annotation
Entity
enthält, markiert die Regel die Annotation Entity in der referenzierten Klasse.
Die Korrektur hängt in diesem Fall davon ab, ob die Anwendung diese Klasse als Entität oder als integrierbare Klasse verwendet.
@Entity manuell in eine Annotation @Embeddable.@Embedded integrieren, und entfernen Sie die Annotation @Embedded.
Embedded-Annotation in einem Attribut enthalten ist, in dem sich die integrierte Klasse nicht im Umfang
des Scans befindet und nicht geprüft werden kann, wird die Annotation Embedded markiert.
Sie können den Umfang der Analyse auf weitere Klassen erweitern und den Scan erneut ausführen oder Sie können manuell prüfen, ob die integrierbare Klasse ordnungsgemäß
annotiert ist.
In diesem Beispiel markiert die Regeln die Annotation @Entity in der Klasse
EmbeddableEntity.
import javax.persistence.EmbeddedId; import javax.persistence.Entity; @Entity public Klasse EmbeddedEntity { @Id private int id; @Embedded privat EmbeddableEntity ee;}
import javax.persistence.Entity; @Entity öffentliche Klasse EmbeddableEntity { private int embedField; ...}
Zur Behebung des Problems überprüfen Sie die Verwendung der Klasse
EmbeddableEntity manuell, um sicherzustellen, dass sie nicht auch als Entitätsklasse
verwendet wird, damit Sie die Annotation @Entity in eine Annotation @Embeddable ändern können.
import javax.persistence.Embeddable; import javax.persistence.Id; @Entity public Klasse EmbeddedEntity { @Id private int id; @Embedded privat EmbeddableEntity ee;}
import javax.persistence.Embeddable; @Embeddable public class EmbeddableEntity { 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.