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 public class GeneratedValueEntity { @Id @GeneratedValue private int id; } |
クイック・フィックスにより、@GeneratedValue アノテーションが変更され @TableGenerator アノテーションが追加されます。
import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; @Entity public class GeneratedValueEntity { @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 ガイドを参照してください。