2016-03-03 51 views
0

我有一個eclipselink實體ID列:的EclipseLink生成的ID,而非JPA過程添加記錄太

@Id 
@Basic(optional = false) 
@NotNull 
@Column(name = "ID") 
private Long id; 

的問題是,無論我用什麼生成策略,我得到的錯誤,因爲我有一個ETL工具插入記錄和eclipse鏈接生成器似乎無法在創建新的ID之前檢查現有的ID。

例如,如果JPA發電機剛剛生成的ID 49爲一個新的記錄,則ETL工具生成20個記錄帶ID 50-70,當我創建另一個蝕鏈路記錄發電機又發表了50爲ID,已經被使用了。

我該如何處理?

回答

1

您的ID生成策略需要:

  1. 根據數據庫中的東西。
  2. 獲取新的id並以原子方式更新下一個,而無需等待提交。
  3. 由EclipseLink和ETL工具使用。

如果你滿足所有三個條件,那麼它應該工作,除非數據庫本身不是線程安全的。

滿足這些條件的最簡單方法可能是在數據庫的列定義中包含AUTO_INCREMENT。另一種選擇是序列發生器,只要你的數據庫支持它,但你必須確保ETL工具使用序列,而不是,例如,找到最大電流ID並加1. 1.我猜測ETL工具使用自己的自定義id代(例如max + 1)是您的問題。