在一个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
注释您的类