在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
。
答案 0 :(得分:0)
我认为如果您希望Spring执行自动错误处理(异常转换),您需要使用@Repository