すべてのエンティティーに 1 次キーが必要

OpenJPA では、1 次キーなしでエンティティー・クラスを定義できます。その場合、ID というデフォルトの 1 次キーが生成されます。 EclipseLink では、すべてのエンティティー・クラスが、@Id@EmbeddedId、または @IdClass アノテーションを使用して 1 次キーとして指定された属性を持つ必要があります。

この規則はエンティティー・クラスをスキャンし、@Id@EmbeddedId、または @IdClass のアノテーションが付けられた属性を持っているかを検査します。 このようなアノテーションが付けられている属性がないクラスについて、このエンティティーに対して OpenJPA で生成された列を使用する ID 属性を追加します。 この規則は、1 つのクラスに含まれているエンティティーの検証に制限されています。 エンティティー・クラスが他のエンティティー・クラスまたはマップされたスーパークラスを継承している場合、この規則は、欠落している 1 次キーにフラグを立てません。 このような場合、以下の例のような実行時例外を受け取ったら、1 次キーが欠落しています。

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.

以下のエンティティー・クラスでは、この規則によって Entity アノテーションにフラグが立てられます。

import javax.persistence.Entity;

@Entity
public class EntityNoId {

}

1 次キーを指定するには、アノテーションを付けた属性を追加します。

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

OpenJPA から EclipseLink へのマイグレーションの問題については、 OpenJPA to EclipseLink JPA Migration: Mappings ガイドを参照してください。