2

Web サービスを呼び出すコードがあり、ID を返します。休止状態を使用して、この ID をデータベースに保存しています。セッションを開いてコミットし、含まれているコード内で例外が発生するとロールバックするフィルターがあります。Web サービスによって返された ID を取得する方法がないため、後でコードで例外が発生した場合でも、これをデータベースに保存したいと考えています。同じセッションを使用してこれを行う方法はありますか?

4

2 に答える 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 に答える