具有自動產生值的屬性需要有配置

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 至 EclipseLink JPA 移轉:對映手冊。