webappでは、Spring 4.3.9とHibernate 5.2.10をJPAプロバイダとして使用しています。SpringがObjectOptimisticLockingFailureExceptionをスローし、その他の時にOptimisticLockExceptionをスローする
@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
しか扱いません。
であなたのクラスに注釈を付ける必要があると思うはい、私はクラスレベルで '@のRepository'を持っています。 –
'@ Repository'は、アノテーションで型の境界を越えたときにのみ機能します - バネはそれをラップするので、intramethodロジックまたは同じオブジェクト呼び出しは影響を受けません。 – chrylis
手動フラッシュは、Bean管理のトランザクション境界で実行されますか? – fg78nc