Восстановление после исключения Hibernate Optimistic Locking

В последнее время столкнулся со странной проблемой. Я попытался изящно обработать исключение устаревшего состояния. Но в блоке 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
}

Может кто-нибудь взглянуть на это. Я не могу понять причину, по которой он все еще выдает исключение оптимистической блокировки после правильной обработки.

EDIT 1: трассировка стека:

В блоке 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
}
. Я даже представить не могу, как это компилируется. Попробуйте заменить его именем исключения в трассировке стека?


person vipulk10    schedule 29.04.2020    source источник
comment
отредактировал вопрос. Пожалуйста, посмотрите   -  person Simon Martinelli    schedule 29.04.2020
comment
org.springframework.orm.hibernate5.HibernateOptimisticLockingFailureException: пакетное обновление вернуло неожиданное количество строк из обновления [0]; фактическое количество строк: 0; ожидается: 1; вложенным исключением является org.hibernate.StaleStateException: пакетное обновление вернуло неожиданное количество строк из обновления [0]; фактическое количество строк: 0; ожидается: 1 [ИНФОРМАЦИЯ] в org.springframework.orm.hibernate5.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:283) [ИНФОРМАЦИЯ] в org.springframework.orm.hibernate5.HibernateTransactionManager.convertHibernateAccessException(HibernateTransactionManager.java:755) [ИНФОРМАЦИЯ] в org.springframework.orm.hibernate5.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:590) [INFO] в org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:765) [INFO] в org.springframework.transaction поддержка. (TransactionAspectSupport.java:292) [INFO] в org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96) [ИНФО] на org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) [ИНФО] на org.springframework.aop. framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213) [ИНФОРМАЦИЯ] в com.sun.proxy.$Proxy155.saveOrUpdate(Неизвестный источник) [ИНФОРМАЦИЯ] в 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) [ИНФОРМАЦИЯ] в sun.reflect.NativeMethodAccessorImpl.invoke0 (собственный метод) [ИНФОРМАЦИЯ] в sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) [ИНФОРМАЦИЯ] в sun.reflect.DelegatingMethodAccessorImpl .invoke(DelegatingMethodAccessorImpl.java:43) [INFO] в java.lang.reflect.Method.invoke(Method.java:498) [INFO] в net.sf.gilead.gwt.PersistentRemoteService.processCall(PersistentRemoteService.java:115 ) [ИНФОРМАЦИЯ] на 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) [ИНФОРМАЦИЯ] в javax.servlet.http.HttpServlet.service(HttpServlet.java:790) [ИНФОРМАЦИЯ] в org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:812) [ИНФОРМАЦИЯ] в 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   -  person vipulk10    schedule 29.04.2020


Ответы (2)


Проблема была решена, я также копировал версию связанных дочерних объектов в поле to, что приводило к сохранению более старой версии дочерних объектов и, следовательно, к ошибке.

person Michael Kreutz    schedule 29.04.2020

Не могли бы вы опубликовать исключения и трассировки стека, которые вы получили

person vipulk10    schedule 01.05.2020