从休眠乐观锁定异常中恢复

问题描述 投票:0回答:2

我最近遇到了一个奇怪的问题。我试图优雅地处理过时的状态异常。但是在catch块中,它仍然会引发异常。以下是代码段

public void saveObject(Object ob){
   try{
      sessionFactory.getCurrentSession().saveOrUpdate(ob);
   }catch(org.springframework.orm.hibernate5.HibernateOptimisticLockingFailureException e){
       object latestObject = // get latest object from db;
       copyFieldsFromObToLatestObject(ob,latestObject);
       // print the version of of both object

    LOGGER.info(" ui_version="+ob.getVersion().longValue()+" 
                 entity_version="+latestObject.getVersion().longValue());
          // the ui _version is less than entity_ version as expected 

        sessionFactory.getCurrentSession().saveOrUpdate(latestObject); // at this line I still get the same optimistic locking exception 

   }
}
 /**

 ob2 is the latest object which contains the correct  version hence copying the fields from previous object to this latest object
**/
private void copyFieldsFromObToLatestObject(ob1,ob2){
    ob2.setA(ob1.getA())..
   so on
}

有人可以看看这个吗?我无法得到正确处理后仍引发乐观锁定异常的原因

编辑1堆栈跟踪

org.springframework.orm.hibernate5.HibernateOptimisticLockingFailureException:批处理更新从更新[0]返回意外行数;实际行数:0;预期:1;嵌套的异常是org.hibernate.StaleStateException:批处理更新从更新[0]返回了意外的行数;实际行数:0;预期:1[INFO] org.springframework.orm.hibernate5.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:283)[INFO] org.springframework.orm.hibernate5.HibernateTransactionManager.convertHibernateAccessException(HibernateTransactionManager.java:755)[INFO] org.springframework.orm.hibernate5.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:590)[INFO] org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:765)[INFO] org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:734)[INFO] org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:518)[INFO] org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:292)[INFO] org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96)[INFO] org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)[INFO] org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213)[INFO] com.sun.proxy。$ Proxy155.saveOrUpdate(未知来源)[INFO]位于biz.kaar.common.services.appointment.impl.AppointmentServiceExtension1BOImpl.handleStaleStateException(AppointmentServiceExtension1BOImpl.java:1520)[INFO]在biz.kaar.common.services.appointment.impl.AppointmentServiceExtension1BOImpl.saveSAR(AppointmentServiceExtension1BOImpl.java:845)[INFO]位于biz.kaar.common.services.DBServiceImpl.saveSAR(DBServiceImpl.java:382)[INFO]位于sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)[INFO]在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)[INFO]位于sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)[INFO]在java.lang.reflect.Method.invoke(Method.java:498)net.sf.gilead.gwt.PersistentRemoteService.processCall(PersistentRemoteService.java:115)上的[INFO][INFO],位于biz.kaar.common.security.AuthorizedGWTServlet.processCall(AuthorizedGWTServlet.java:252)[INFO]位于biz.kaar.common.services.RemoteServletWithLogging.processCall(RemoteServletWithLogging.java:90)[INFO] com.google.gwt.user.server.rpc.RemoteServiceServlet.processPost(RemoteServiceServlet.java:373)[INFO] com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost(AbstractRemoteServiceServlet.java:62)[INFO]在javax.servlet.http.HttpServlet.service(HttpServlet.java:707)[INFO]在javax.servlet.http.HttpServlet.service(HttpServlet.java:790)[INFO] org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:812)[INFO] org.eclipse.jetty.servlet.ServletHandler $ CachedChain.doFilter(ServletHandler.java:1669)[INFO] org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter(FilterChainProxy.java:316)[INFO] org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityIntercep

java spring hibernate optimistic-locking staleobjectstateexception
2个回答
1
投票

在catch块中,您应该捕获抛出的异常并要处理。你抓住了Optimistic locking exception。我什至无法想象这是如何编译的。尝试用堆栈跟踪中的异常名称替换它吗?


0
投票

问题已解决,我也在to字段中复制了关联的子实体的版本,这导致保存较旧的子实体版本并因此导致错误

© www.soinside.com 2019 - 2024. All rights reserved.