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í.