Caused by: java.sql.SQLIntegrityConstraintViolationException: ORA-00001: 違反唯一約束條件 (XXXX.SYS_C0023807)
這個錯大致一看,肯定是主鍵衝突了,因爲是ORACLE 所以指定了 SEQUENCE 。
實體配置如下:
@SequenceGenerator(name = "SEQ_XXX", sequenceName = EntityConstant.SCHEMA + ".SEQ_XXXX")
數據庫的SEQUENCE 顯示如下:
看樣子設置沒有問題,但是發現一個細節,就會保存時候只有第一次查詢了下一個序列值,之後插入不再查詢。等50個請求以後再次查詢,經查看多貼原因是 HIBERNATE5 需要設置步長:allocationSize=x
原貼如下:
工作中使用到了oracle12的版本,使用hibernate5保存時發現生成的結果除了1正常其餘的都從-49開始往上加,
數據庫自身查詢是沒有問題的。
跟蹤hibernate5的源碼發現@SequenceGenerator還需要配置一個allocationSize=1才能正常
如
@SequenceGenerator(name="UMS_USER_SEQ", sequenceName="UMS_USER_SEQ",allocationSize = 1)
相關源碼在org.hibernate.id.enhanced.PooledOptimizer#generate
generationState.value = callback.getNextValue();
// unfortunately not really safe to normalize this
// to 1 as an initial value like we do the others
// because we would not be able to control this if
// we are using a sequence...
if ( generationState.value.lt( 1 ) ) {
log.pooledOptimizerReportedInitialValue( generationState.value );
}
// the call to obtain next-value just gave us the initialValue
if ( ( initialValue == -1
&& generationState.value.lt( incrementSize ) )
|| generationState.value.eq( initialValue ) ) {
generationState.hiValue = callback.getNextValue();
}
else {
generationState.hiValue = generationState.value;
generationState.value = generationState.hiValue.copy().subtract( incrementSize - 1 );
}
總結:不知爲何HIBERNATE 不去讀取ORACLE 設置的步長信息。