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 指南。