2017-07-12 6 views
0

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しか扱いません。

答えて

0

私はあなたが春には(例外翻訳)自動エラー処理を行いたい場合は、@Repository

+0

であなたのクラスに注釈を付ける必要があると思うはい、私はクラスレベルで '@のRepository'を持っています。 –

+1

'@ Repository'は、アノテーションで型の境界を越えたときにのみ機能します - バネはそれをラップするので、intramethodロジックまたは同じオブジェクト呼び出しは影響を受けません。 – chrylis

+0

手動フラッシュは、Bean管理のトランザクション境界で実行されますか? – fg78nc

関連する問題