我总是遇到矛盾错误


引起原因:java.sql.BatchUpdateException:ORA-00001:违反了唯一约束


每当我尝试调用同步方法时,该方法会在由HBM生成主键的表中插入一个值:

 <id name="logId" type="java.lang.Long">
        <column name="LOG_ID" precision="20" scale="0" />
        <generator class="sequence">
            <param name="sequence">TRANS_LOG_ID</param>
            <param name="allocationSize">100</param>
        </generator>
    </id>


这是线程调用的方法:

public synchronized static void saveTransLog(String detail, String stage) {

        TransLog transLog = new TransLog();
        transLog.setDetail(detail);
        transLog.setStage(stage);

    ...

        TransLogService.save(transLog);

}


我想知道对于这些多线程方案是否有更可靠的锁处理。还是我需要添加一些东西来解决我的约束违例问题。

非常感谢你。

最佳答案

可能是该序列的当前值与您的行的主键冲突。您可以使用以下查询来验证这一点。

SELECT trans_log_id.curr_val FROM dual;


然后将此数字与列LOG_ID的最大值进行比较。

这两个值应相等或序列的当前值应更大。如果序列的当前值较小,请使用语句trans_log_id.next_val递增序列的值。

09-11 18:42