0

我总是收到约束错误

引起: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);

}

我想知道对于这些类型的多线程场景是否有更可靠的锁处理。或者我需要添加一些东西来解决我的约束违规问题。

非常感谢。

4

1 回答 1

1

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

SELECT trans_log_id.curr_val FROM dual;

并将这个数字与该列的最大值进行比较LOG_ID

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

于 2013-09-07T10:45:24.630 回答