Spring有时会抛出ObjectOptimisticLockingFailureException,有时会抛出OptimisticLockException

时间:2017-07-12 18:17:12

标签: java spring hibernate jpa

在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

1 个答案:

答案 0 :(得分:0)

我认为如果您希望Spring执行自动错误处理(异常转换),您需要使用@Repository

为您的班级添加注释