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