Všechny entity musí mít primární klíč

V rozhraní OpenJPA mohou být třídy entity definovány bez primárního klíče, v takovém případě je generován výchozí primární klíč s názvem ID. EclipseLink vyžaduje, aby všechny třídy entity měly atribut, který je identifikován jako primární klíč pomocí anotace @Id, @EmbeddedId nebo @IdClass.

Toto pravidlo prochází a hledá třídy entity a ověřuje, že mají atribut anotovaný s @Id, @EmbeddedId nebo @IdClass. Pro třídy bez těchto anotovaných atributů přidejte atribut ID, který pro tuto entitu používá sloupec generovaný rozhraním OpenJPA. Toto pravidlo je omezeno na ověřování entit, které jsou obsaženy v jedné třídě. Pokud třída entity rozšiřuje jiné třídy entit nebo mapované supertřídy, toto pravidlo neoznačí chybějící primární klíče. V těchto případech v případě pokud obdržíte výjimku za běhu, například v následujícím příkladu, chybí primární klíč:

Exception Description: Entity class [class org.apache.openjpa.persistence.annotations.EntityA] has no primary key specified. It should define either an @Id, @EmbeddedId or an @IdClass. If you have defined PK using any of these annotations then make sure that you do not have mixed access-type (both fields and properties annotated) in your entity class hierarchy.

V následující třídě entity je anotace Entity označena pravidlem.

import javax.persistence.Entity;

@Entity
public class EntityNoId {

}

Chcete-li identifikovat primární klíč, přidejte anotovaný atribut.

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;
}

Informace o problémech migrace OpenJPA na EclipseLink viz příručka Migrace OpenJPA na EclipseLink JPA: Mapování.