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 标识;}
自动修复将修改 @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 , generator = "OPENJPA_SEQUENCE_TABLE") private int 标识;}
有关此问题和其他 OpenJPA 到 EclipseLink 迁移问题的信息,请参阅 OpenJPA to EclipseLink JPA Migration: Mappings 指南。