2014-02-07 23 views
9

我收到的时候我想从我的Spring MVC应用程序更新我的数据库值这个错误:org.hibernate.StaleStateException:批量更新从update [0]返回意外的行数;实际行数:0;预期

org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1 
     at org.hibernate.jdbc.Expectations$BasicExpectation.checkBatched(Expectations.java:61) 
     at org.hibernate.jdbc.Expectations$BasicExpectation.verifyOutcome(Expectations.java:46) 
     at org.hibernate.jdbc.BatchingBatcher.checkRowCounts(BatchingBatcher.java:68) 
     at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:48) 
     at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:242) 
     at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:235) 
     at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:140) 
     at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298) 
     at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27) 
     at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000) 
     at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338) 
     at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106) 
     at org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:656) 
     at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:754) 
     at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:723) 
     at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:393) 
     at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:120) 
     at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) 
     at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202) 
     at com.sun.proxy.$Proxy21.updatePerson(Unknown Source) 
     at se.lowdin.civilforsvaret.webapp.controller.EditPersonContoller.save(EditPersonContoller.java:57) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
     at java.lang.reflect.Method.invoke(Method.java:601) 
     at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:176) 
     at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:426) 
     at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:414) 
     at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:790) 
     at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719) 
     at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644) 
     at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:560) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:641) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:722) 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304) 
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
     at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240) 
     at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164) 
     at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462) 
     at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164) 
     at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) 
     at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:562) 
     at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
     at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:395) 
     at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:250) 
     at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188) 
     at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:166) 
     at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302) 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
     at java.lang.Thread.run(Thread.java:722) 
    DEBUG: org.hibernate.jdbc.AbstractBatcher - about to close PreparedStatement (open PreparedStatements: 1, globally: 1) 
    TRACE: org.hibernate.jdbc.AbstractBatcher - closing statement 
    ERROR: org.hibernate.event.def.AbstractFlushingEventListener - Could not synchronize database state with session 
    org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1 
     at org.hibernate.jdbc.Expectations$BasicExpectation.checkBatched(Expectations.java:61) 
     at org.hibernate.jdbc.Expectations$BasicExpectation.verifyOutcome(Expectations.java:46) 
     at org.hibernate.jdbc.BatchingBatcher.checkRowCounts(BatchingBatcher.java:68) 
     at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:48) 
     at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:242) 
     at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:235) 
     at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:140) 
     at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298) 
     at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27) 
     at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000) 
     at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338) 
     at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106) 
     at org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:656) 
     at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:754) 
     at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:723) 
     at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:393) 
     at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:120) 
     at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) 
     at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202) 
     at com.sun.proxy.$Proxy21.updatePerson(Unknown Source) 
     at se.lowdin.civilforsvaret.webapp.controller.EditPersonContoller.save(EditPersonContoller.java:57) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
     at java.lang.reflect.Method.invoke(Method.java:601) 
     at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:176) 
     at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:426) 
     at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:414) 
     at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:790) 
     at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719) 
     at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644) 
     at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:560) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:641) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:722) 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304) 
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
     at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240) 
     at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164) 
     at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462) 
     at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164) 
     at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) 
     at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:562) 
     at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
     at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:395) 
     at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:250) 
     at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188) 
     at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:166) 
     at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302) 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
     at java.lang.Thread.run(Thread.java:722) 
    TRACE: org.hibernate.jdbc.ConnectionManager - registering flush end 
    DEBUG: org.hibernate.transaction.JDBCTransaction - rollback 
    DEBUG: org.hibernate.transaction.JDBCTransaction - re-enabling autocommit 
    DEBUG: org.hibernate.transaction.JDBCTransaction - rolled back JDBC Connection 
    TRACE: org.hibernate.jdbc.JDBCContext - after transaction completion 
    DEBUG: org.hibernate.jdbc.ConnectionManager - transaction completed on session with on_close connection release mode; be sure to close the session to release JDBC resources! 
    TRACE: org.hibernate.impl.SessionImpl - after transaction completion 
    TRACE: org.hibernate.impl.SessionImpl - closing session 
    TRACE: org.hibernate.jdbc.ConnectionManager - performing cleanup 
    DEBUG: org.hibernate.jdbc.ConnectionManager - releasing JDBC connection [ (open PreparedStatements: 0, globally: 0) (open ResultSets: 0, globally: 0)] 
    TRACE: org.hibernate.jdbc.JDBCContext - after transaction completion 
    DEBUG: org.hibernate.jdbc.ConnectionManager - transaction completed on session with on_close connection release mode; be sure to close the session to release JDBC resources! 
    TRACE: org.hibernate.impl.SessionImpl - after transaction completion 
    feb 07, 2014 11:04:32 FM org.apache.catalina.core.StandardWrapperValve invoke 
    SEVERE: Servlet.service() for servlet [spring] in context with path [/CRUDWebAppMavenized] threw exception [Request processing failed; nested exception is org.springframework.orm.hibernate3.HibernateOptimisticLockingFailureException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1; nested exception is org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1] with root cause 
    org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1 
     at org.hibernate.jdbc.Expectations$BasicExpectation.checkBatched(Expectations.java:61) 
     at org.hibernate.jdbc.Expectations$BasicExpectation.verifyOutcome(Expectations.java:46) 
     at org.hibernate.jdbc.BatchingBatcher.checkRowCounts(BatchingBatcher.java:68) 
     at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:48) 
     at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:242) 
     at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:235) 
     at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:140) 
     at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298) 
     at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27) 
     at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000) 
     at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338) 
     at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106) 
     at org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:656) 
     at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:754) 
     at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:723) 
     at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:393) 
     at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:120) 
     at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) 
     at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202) 
     at com.sun.proxy.$Proxy21.updatePerson(Unknown Source) 
     at se.lowdin.civilforsvaret.webapp.controller.EditPersonContoller.save(EditPersonContoller.java:57) 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
     at java.lang.reflect.Method.invoke(Method.java:601) 
     at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:176) 
     at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:426) 
     at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:414) 
     at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:790) 
     at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719) 
     at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644) 
     at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:560) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:641) 
     at javax.servlet.http.HttpServlet.service(HttpServlet.java:722) 
     at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304) 
     at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
     at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:240) 
     at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:164) 
     at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:462) 
     at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:164) 
     at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100) 
     at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:562) 
     at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
     at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:395) 
     at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:250) 
     at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:188) 
     at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:166) 
     at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302) 
     at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
     at java.lang.Thread.run(Thread.java:722) 

所以我实际的错误似乎有什么东西在数据库和什么作为ID's更新。 在我的GET方法,我获取当前的ID在这种情况下是10

@Autowired 
PersonService service; 


@RequestMapping(method = RequestMethod.GET) 
public ModelAndView index(@PathVariable int id) { 

    EditPersonBean bean = new EditPersonBean(); 

    if (id > 0) { 
     Person person = service.getPerson(id); 
     bean.copyValuesToBean(person); 
    } 

    ModelAndView mav = new ModelAndView("editPerson"); 
    mav.addObject("editPersonBean", bean); 
    return mav; 

} 

但在我POST方法这个ID,这是10突然0,我相信可能是这个错误的原因是什么?

@RequestMapping(value = "/edit", method = RequestMethod.POST) 
     public String save (EditPersonBean bean, Person person, @RequestParam(value = "file", required = false) MultipartFile file) { 


      System.out.println("incoming id : " + bean.getId()); 

      try { 

       Blob blob = Hibernate.createBlob(file.getInputStream()); 
       bean.copyBeanValuesToPerson(person,blob); 
       service.updatePerson(person); 

      } catch (IOException e) { 
       e.printStackTrace(); 
      } 


      return "redirect:/person.html"; 
     } 

那么,什么可能是这个原因或错误是别的?

public class EditPersonBean { 

     private int id; 
     private String firstName; 
     private String lastName; 
     private String email; 
     private String phoneNumber; 
     private String otherInfo; 
     private Blob image; 
     private String userName; 
     private String password; 

     public void copyValuesToBean(Person person){ 

      setId((int) person.getId()); 
      setFirstName(person.getFirstName()); 
      setLastName(person.getLastName()); 
      setEmail(person.getEmail()); 
      setPhoneNumber(person.getPhoneNumber()); 
      setOtherInfo(person.getOtherInfo()); 
      setImage(person.getImage()); 
      setUserName(person.getUserName()); 
      setPassword(person.getPassword());; 

     } 

@Entity 
public class Person { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "ID") 
    private int id; 
    @Column(name = "FIRSTNAME") 
    private String firstName; 
    @Column(name = "SECONDNAME") 
    private String lastName; 
    @Column(name = "EMAIL") 
    private String email; 
    @Column(name = "MobilePHONENUM") 
    private String phoneNumber; 
    @Column(name = "OTHER") 
    private String otherInfo; 
    @Column(name = "image") 
    @Lob 
    private Blob image; 
    @NotEmpty 
    @Size(min = 1, max = 50) 
    @Column(name = "username") 
    private String userName; 
    @NotEmpty 
    @Size(min = 1, max = 20) 
    @Column(name = "password") 
    private String password; 

    public Person() { 

    } 

    public Person(int id, String firstName, String lastName, String email, 
      String phoneNumber, String otherInfo, Blob image, String userName, String password) { 

     setId(id); 
     setFirstName(firstName); 
     setLastName(lastName); 
     setEmail(email); 
     setPhoneNumber(phoneNumber); 
     setOtherInfo(otherInfo); 
     setImage(image); 
     setUserName(password); 
     setPassword(userName); 

    } //Getters and setters... 

JPA类:

@Override 
    public Person getPerson(int personId) { 
     return (Person)session.getCurrentSession().get(Person.class, personId); 
    } 

回答

10

只有这样,才能准确知道发生了什么是你的hibernate.cfg.xml配置开启Hibernate的语句记录。这是因为堆栈跟踪中的行号都不对应执行实际Hibernate操作的代码部分。取而代之的是,这些操作被批量处理,然后在事务关闭时(或者在指定的批量操作之后)立即执行。

启用休眠语句记录,

<property name="show_sql">true</property> 
    <property name="format_sql">true</property> 
    <property name="use_sql_comments">true</property> 

这就是说,上次我就遇到了这个问题,这是一个创纪录的情况下,被普遍HQL更新在不同的线程/事务删除了,当前线程/事务尝试按ID删除完全相同的记录。不幸的是,由于事务是批处理的,所以在你删除的时候没有看到它,而是在程序执行的后面的某个点。因此需要打开语句日志记录来查看哪个实际的Hibernate操作触发了异常。

+0

与此我发现,我用'EntityManager'以错误的方式和'insert'而不是'update'发出。谢谢 –

11

当hibernate找不到需要更新的所有行时,通常会导致此错误。 这意味着,当您尝试更新从数据库中提取的某些对象时,它们不再真正存在(或从未存在过)。

可能是因为另一个线程正在删除它们,或者数据库的隔离模式设置为read_uncommited,因此由另一个事务创建的行无法保存(由于事务故障)并且不再存在。

1

只需在您的hibernate查询中键入save而不是saveOrUpdate。这是由于之前的日志,你的类正在生成一些以前存储在你的表中的其他ID。因此,休眠尝试使用相同的ID进行更新,并且它找不到具有该ID的行,因此它给出了一个staleStateException

1

我遇到了类似的问题,我试图保存一个对象,其ID是一个原始字段(长),并在创建对象时,ID默认设置为0,并假定休眠我想更新id = 0的行(显然不存在)。

我的解决方案是将id字段更改为Long(wrapper),这样,当我创建一个新实例时,id被设置为null,并且Hibernate知道我正在向数据库中插入一个新元素。
我希望它有帮助。谢谢。

0

100%解决方法: 1确保ID在表自动递增 您的所有外键不为空 范围会议

0

添加级联进行更新。将解决问题,如果涉及外键。

相关问题