具有自动生成的值的属性需要配置

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