Hibernate - 批量更新从更新返回意外行数:0实际行数:0预期:1

问题

我得到以下hibernate错误。我能够识别导致问题的功能。不幸的是,函数中有几个DB调用。我无法找到导致问题的行,因为hibernate会在事务结束时刷新会话。下面提到的hibernate错误看起来像是一般错误。它甚至没有提到哪个Bean导致了这个问题。有谁熟悉这个hibernate错误?

org.hibernate.StaleStateException: Batch update returned unexpected row count from update: 0 actual row count: 0 expected: 1
        at org.hibernate.jdbc.BatchingBatcher.checkRowCount(BatchingBatcher.java:93)
        at org.hibernate.jdbc.BatchingBatcher.checkRowCounts(BatchingBatcher.java:79)
        at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:58)
        at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:195)
        at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:235)
        at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:142)
        at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:297)
        at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
        at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:985)
        at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:333)
        at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
        at org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:584)
        at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransacti
onManager.java:500)
        at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManag
er.java:473)
        at org.springframework.transaction.interceptor.TransactionAspectSupport.doCommitTransactionAfterReturning(Transaction
AspectSupport.java:267)
        at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:106)
        at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:170)
        at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:176)

#1 热门回答(46 赞)

我删除了一个根本不存在的记录时遇到了同样的异常。因此,检查你正在更新的记录/删除实际存在于DB中


#2 热门回答(43 赞)

如果你的交易没有代码和映射,那么几乎不可能调查问题。

但是,要更好地处理导致问题的原因,请尝试以下操作:

  • 在hibernate配置中,将hibernate.show_sql设置为true。这应该显示执行的SQL并导致问题。
  • 将Spring和Hibernate的日志级别设置为DEBUG,这样可以更好地了解哪一行导致问题。
  • 创建一个单元测试,无需在Spring中配置事务管理器即可复制问题。这可以让你更好地了解有问题的代码行。

希望有所帮助。


#3 热门回答(35 赞)

解决方案:在id属性的Hibernate映射文件中,如果使用任何生成器类,则对于该属性,不应使用setter方法显式设置该值。

如果明确设置Id属性的值,则会导致上述错误。检查这一点以避免此错误。或者在映射文件中提到字段生成器="native"或"incremental"时出现错误,并且在DATABASE中映射的表不是auto_incremented解决方法:转到数据库并更新表以设置auto_increment