2016-10-31 2 views
0

2つのデータベーステーブルroleとrole_menuがあります。役割の主キーを参照する外部キーがrole_menuにあります。整合性制約の削除エラーをどのように捕捉するのですか?

これで、role_menuに関連付けられた外部キーを持つ行が削除されました。それでは、どのように整合性制約の削除に対処する

WARN : org.hibernate.engine.jdbc.spi.SqlExceptionHelper - SQL Error: 2292, SQLState: 23000 
ERROR: org.hibernate.engine.jdbc.spi.SqlExceptionHelper - ORA-02292: integrity constraint (PTA.FK_ROLE_MEN_R_ROLE_ME_ROLE) violated - child record found 

:私はこれらのテキストを持ってコンソールで

@Override 
@Transactional 
public void delete(String role_code) { 
    try { 
    sessionFactory.getCurrentSession().delete((Role) sessionFactory.getCurrentSession().get(Role.class, role_code)); 
    } catch (Exception e) { 
     System.out.println("error : there is fk !"); 
    } 

} 

:私は、tryキャッチ内部の削除コードを囲むしようとしましたが、実行は、catchブロックに入りません。エラー?

答えて

1

この問題は、トランザクションがコミットされる直前にセッションがデータベースと一致している場合にのみ例外がスローされるという事実に起因します。 @Transactionalアノテーションを使用しているので、catchブロックの直後にメソッドの最後に起こっています。

@Override 
@Transactional 
public void delete(String role_code) { 
    try { 
     Session session = sessionFactory.getCurrentSession(); 
     session.delete((Role) session.get(Role.class, role_code)); 
     session.flush(); 
    } catch (Exception e) { 
     System.out.println("error : there is fk !"); 
    } 
} 

注そこにフラッシュを使用しないように良くなると、別のレベルで例外をキャッチし、それがユースケースに依存していること:tryブロックの終了時にセッションをフラッシュすると、トリックを行う必要があります。

+0

トランザクションはすでにロールバックとしてマークされているため、別のレベルでそれをキャッチすることはできません。とにかく、これはすべて非常に悪い考えであり、いくつかの原則を破っています。 http://docs.jboss.org/hibernate/core/3.5/api/org/hibernate/Session.html「セッションで例外がスローされた場合、トランザクションをロールバックしてセッションを破棄しなければなりません。セッションの内部状態例外が発生した後にデータベースと一貫性がない可能性があります。 – Gab

+0

別のレベルで例外をキャッチすることは、トランザクションが他のレベルで作成されてからこの関数に伝播することを意味します... –

関連する問題