2011-01-29 23 views
1

Spring、JPA、Hibernateプロジェクトでは、例外処理を動作させようとしています。Spring EntityManagerのHibernate例外処理

@Repository("mscoutService") 
    public class MScoutServiceImpl implements MScoutService, Serializable { 

     @PersistenceContext 
     private EntityManager em; 

... 
     @Override 
     @Transactional 
     public void deleteMission(Long missionId) { 
      try { 
       Mission mis = em.find(Mission.class, missionId); 
       em.remove(mis); 
      } catch (Exception e) { 
       handle_exception(); 
      } 
     } 

私は(依存エンティティはまだorg.springframework.orm.hibernate3.HibernateJdbcExceptionで失敗します削除を提示している場合など)基本的な休止/ JDBC/DBの例外をキャッチしようとしている次のコードの場合いくつかのアクションを実行します。ただし、catchコードには決して到達しません(デバッガでチェックされます)。

私はこの春には、これを管理方法に関係していると思いますが、私は

すべてのヘルプは高く評価され...私はem.remove()中に例外をキャッチすることができますどれだけ知っていません!

答えて

4

これは、セッションがフラッシュされたときに例外が発生するためです。トランザクションがコミットされたときに、つまりバネプロキシによってフラッシュされます。手動でフラッシュする場合は、entityManager.flush()を使用できます。

+0

ありがとうございます! em.flush()を追加すると例外ハンドラがキャッチするようになりました。これが私の問題を解決しました。 – Tom

+0

私はこのスレッドが少し古いと知っていますが、@Transactionalを使用しているリポジトリの上の例外の1つのレイヤーを処理する方が良いでしょうか?それとも、例外を処理するのに好ましい方法ですか? – oberger

+0

はい、一般的にリポジトリの外で行う方が良いです。 – Bozho

関連する問題