Alle Entitäten müssen einen Primärschlüssel haben

In OpenJPA können Entitätsklassen ohne Primärschlüssel definiert werden. In diesem Fall wird ein Standardprimärschlüssel mit dem Namen ID generiert. EclipseLink erfordert, dass alle Entitätsklassen ein Attribut haben, das mit der Annotation @Id, @EmbeddedId oder @IdClass als Primärschlüssel identifiziert wird.

Diese Regel durchsucht Entitätsklassen und prüft, ob sie ein Attribut mit der Annotation @Id, @EmbeddedId oder @IdClass haben. Fügen Sie für Klassen, die diese annotierten Attribute nicht haben, ein ID-Attribut hinzu, das die von OpenJPA generierte Spalte für diese Entität verwendet. Diese Regel beschränkt sich auf die Validierung von Entitäten, die in einer einzigen Klasse enthalten sind. Wenn die Entitätsklasse andere Entitätsklassen oder zugeordnete Superklassen erweitert, markiert diese Regel fehlende Primärschlüssel nicht. Wenn Sie also wie im folgenden Beispiel eine Laufzeitausnahme erhalten, fehlt ein Primärschlüssel:

Ausnahmebeschreibung: Für die Entitätsklasse [class org.apache.openjpa.persistence.annotations.EntityA] ist kein Primärschlüssel angegeben. Sie sollte @Id, @EmbeddedId oder @IdClass definieren. Wenn Sie einen Primärschlüssel mit einer dieser Annotationen definiert haben, stellen Sie sicher, dass in Ihrer Entitätsklassenhierarchie nur einziger Zugriffstyp (für annotierte Felder und Eigenschaften) verwendet wird.

In der folgenden Entitätsklasse wird die Annotation Entity von der Regel markiert.

import javax.persistence.Entity;

@Entity
public class EntityNoId {

}

Fügen Sie das annotierte Attribut hinzu, um den Primärschlüssel anzugeben.

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.TableGenerator;

@Entity
public class EntityNoId {

    @Id
    @TableGenerator(name = "OPENJPA_SEQUENCE_TABLE", table = "OPENJPA_SEQUENCE_TABLE", pkColumnName = "ID", valueColumnName = "SEQUENCE_VALUE", pkColumnValue = "0")
    @GeneratedValue(strategy = GenerationType.TABLE, generator = "OPENJPA_SEQUENCE_TABLE")
    private int id;
}

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