在一个Webapp中,我使用Spring 4.3.9和Hibernate 5.2.10作为JPA提供程序。

在bean中,我具有以下类和方法:

    @Repository
    public class VentaDAO {

      @PersistenceContext
      private EntityManager em;

      @Transactional
      public void tryAprobarPago(Decidir decidir) {
        long idAlmuerzoVenta = Long.parseLong(decidir.getSistemaClave());
        AlmuerzoVenta almuerzoVenta = em.find(AlmuerzoVenta.class, idAlmuerzoVenta);

        Almuerzo almuerzo = almuerzoVenta.getAlmuerzo();

        almuerzo.assignNroEntradas(almuerzoVenta);

        almuerzoVenta.setEstado(AlmuerzoVenta.Estado.APROBADA);
        almuerzoVenta = em.merge(almuerzoVenta);

        // force flush to detect potential version conflics BEFORE execute costly SQL operations
        em.flush();

        methodWithCostlySQLOperations();
      }
   }


当使用乐观锁定并且存在版本冲突时,当方法完成执行后数据库刷新自动发生时,@ Transactional方法将引发Spring的ObjectOptimisticLockingFailureException,但是,如果我在中间插入手动flush(),则Spring不会拦截JPA的OptimisticLockException
这种行为使乐观锁定处理成为问题,因为异常的改变取决于方法的编码方式。

我宁愿只处理ObjectOptimisticLockingFailureException

最佳答案

我认为,如果您希望Spring执行自动错误处理(异常翻译),则需要使用@Repository注释您的类

10-06 13:13