OpenJPA および EclipseLink は、@GeneratedValue アノテーションまたは @GeneratedValue(strategy=GenerationType.AUTO) アノテーションのいずれかを持つ属性の値を生成するために、異なるテーブルを作成します。
ご使用のアプリケーションが OpenJPA によって生成された属性を持つエンティティーを含む場合、EclipseLink を使用して新規エンティティーを永続化すると、EclipseLink はこれらの値を EclipseLink テーブルから生成しようとするため、エラーが発生します。
この問題は、エンティティーが OpenJPA シーケンス・テーブルを使用して属性の値を生成するように構成することで解決されます。 この構成により、EclipseLink は OpenJPA テーブルにリストされている最後の値を使用して属性値を生成します。
この規則は、@GeneratedValue または @GeneratedValue(strategy=GenerationType.AUTO) のいずれかのアノテーションが付けられた属性をスキャンします。
自動化されたものが提供され、フラッグが付けられる。 @GeneratedValue アノテーションを以下のアノテーションに置き換える:
@TableGenerator(name = "OPENJPA_SEQUENCE_TABLE", table = "OPENJPA_SEQUENCE_TABLE", pkColumnName = "ID", valueColumnName = "SEQUENCE_VALUE", pkColumnValue = "0") @GeneratedValue(strategy = GenerationType.TABLE, generator = "OPENJPA_SEQUENCE_TABLE")
例えば、この規則は、以下のフィールド・アクセス・エンティティー・クラスの @GeneratedValue アノテーションにフラグを立てます。
import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; @Entity 公開クラス GeneratedValueエンティティー { @Id @GeneratedValue private int id;}
自動修正は @GeneratedValue アノテーションを修正し @TableGenerator 注釈を追加します。
import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; @Entity 公開クラス GeneratedValueエンティティー { @Id @TableGenerator(name = "OPENJPA_SEQUENCE_TABLE", table = "OPENJPA_SEQUENCE_TABLE", pkColumnName = "ID", valueColumnName = "SEQUENCE_VALUE", pkColumnValue = "0") @GeneratedValue(strategy = GenerationType.TABLE, _sequence_TABLE) "OPENJENC=" private int ID;}
この問題や、OpenJPA から EclipseLink へのマイグレーションに関するその他の問題については、 OpenJPA to EclipseLink JPA Migration: Mappings ガイドを参照してください。