Web サービスを呼び出すコードがあり、ID を返します。休止状態を使用して、この ID をデータベースに保存しています。セッションを開いてコミットし、含まれているコード内で例外が発生するとロールバックするフィルターがあります。Web サービスによって返された ID を取得する方法がないため、後でコードで例外が発生した場合でも、これをデータベースに保存したいと考えています。同じセッションを使用してこれを行う方法はありますか?
質問する
421 次
2 に答える
0
これを行う正しい方法は、2つのトランザクションを使用することです。1つはIDを保存するためのもので、もう1つは残りの作業を保存するためのものです。
EJBを使用している場合は、IDを独自のBeanに保存し、ので注釈を付けることができTransactionAttribute
ますREQUIRES_NEW
。
それ以外の場合は、環境がトランザクションをどのように制御できるかを調べて、そのうちの2つを使用する方法を見つけることができます。
于 2012-09-24T21:59:57.047 に答える
0
誰が例外をスローするかによって異なります。hibernate セッション オブジェクトによってスローされた場合、hibernateセッションのドキュメントに記載されているように、セッションを再利用することはできません。
セッションが例外をスローした場合、トランザクションをロールバックしてセッションを破棄する必要があります。例外が発生した後、セッションの内部状態がデータベースと一致しない可能性があります。
例外が他のコードによってスローされた場合、はい、次のようなことができます。
Long yourIdFromWebservice = ...
try {
// do some processing that might result in an exception
}
catch(//the interesting exception, but not HibernateException) {
//maybe log it, rethrow it
}
finally {
session.save() //save what needed to be saved
}
またはユースケースに応じて:
try {
// do some processing that might result in an exception
session.save() //save all stuff if no exception
}
catch(//the interesting exception, but not HibernateException) {
session.save() //save only the id from the webservice
}
于 2012-09-24T21:35:45.423 に答える