使用java.sql.BatchUpdateException进行hibernate

时间:2012-03-16 19:56:38

标签: database oracle hibernate exception

我正在使用hibernate将我们的类映射到oracle中的表。 我的类有一个主键作为id,由hibernate自动生成

 <id name="jobId" type="long">
        <column name="JOBID" />
        <generator class="increment" />
    </id>

在我的代码中我做了:

Job job = new Job();
do some config for the job.
saveOrUpdate(job);

在我遇到的saveOrUpdate:

org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:96)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:275)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:268)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:184)
at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:51)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1216)
at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:383)
at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:133)
at com.myCompany.BasicDaoImpl.saveOrUpdate(BasicDaoImpl.java:37)
at com.myCompany.JobRoutine.generateJob(JobRoutine.java:142)
Caused by: java.sql.BatchUpdateException: ORA-00001: unique constraint (DBGROUP.SYS_C0011345) violated

at oracle.jdbc.driver.DatabaseError.throwBatchUpdateException(DatabaseError.java:343)
at oracle.jdbc.driver.OraclePreparedStatement.executeBatch(OraclePreparedStatement.java:10700)
at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeBatch(NewProxyPreparedStatement.java:1723)
at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268)
... 13 more

我发现约束是priamry_key。 这个错误总是不开心,但有时候。

有人可以给我一些建议吗?

非常感谢!

1 个答案:

答案 0 :(得分:4)

The documentation说:

  

增量

     

生成long,short或int类型的标识符,仅当没有其他进程将数据插入同一个表时才是唯一的。做   不在群集中使用。

你可能有另一个进程在同一个表中插入行,而Hibernate并不知道它,因为增量生成器只是将下一个值存储在内存中,并假设它是唯一一个在此表中插入行的行。