2011-10-15 10 views
2

私のアプリケーションでは、このサービス内のすべてのメソッドに対してSpringトランザクション境界が宣言されているサービスレイヤがあります。サービス層は、daoと連絡する。私の質問は、DAOメソッドでgetHibernateTemplate.flush()を指定すると、immedieatly dbを更新するか、サービスレイヤメソッドが完了するまで変更をコミットしません。ここで私を助けてください。トランザクションメソッドの明示的なflush()は、データベースを更新するかどうかを指定します。

class someservice{ 
    public void somemethod(){ 
    activitydao.save(domainobj); 
    } 
} 
class ActivityDAO extends HibernateDaoSupport{ 
public void save(domainobj){ 
    getHibernateTemplate().save(domainobj); 
    getHibernateTemplate().flush(); ----> will it update db immediately ? 
} 
} 

ありがとう、 Ramki。

答えて

9

flush()は、その休止状態セッションによって管理されるすべての永続エンティティに対してダーティチェックを行います。永続エンティティがダーティである場合、hibernateはUPDATE SQLをただちにDBに発行します。

しかし、UPDATE SQLを発行しても、データが実際にDBに保存されるわけではなく、実際にDBにデータを保存することを確認するためにトランザクションをコミットする必要があります。したがって、flush()は、DBへのCOMMITなしでUPDATE SQLのみを発行するので、後でエラーが見つかるとデータをロールバックできます。

Springを使用してトランザクションを管理する場合、メソッドが正常に返された場合、トランザクションは自動的にコミットされます。メソッドが戻る前に例外がスローされた場合、トランザクションは自動的にロールバックされます。

+0

クイックアンサーに感謝します。私は細かいところで私の問題を少し説明します。 – Ramki

+0

クイックアンサーに感謝します。私は細かいところで私の問題を少し説明します。 私は以下のクラスを持っています 1)キューでリスンするjmsリスナー。 2)10個のスレッドを含むThreadPoolDeligator。 3)Servicelayerオブジェクトを取得してプロセス要求を取得するRequestExecutor(実行可能クラス) 4)サービスクラス5)daoク​​ラス。 jmsはメッセージを受信すると、内部的にRequestExecutor(3)を呼び出して実行するスレッドプールエグゼキュータに移動し、内部的に処理メソッドを使用して処理します。 – Ramki

+0

servcieメソッドは内部的にdbにいくつかの変更を行い、sendは他のシステムが選択したキューにメッセージを戻して処理し、システムに要求を再送信します。この要求は別のスレッドによって実行されます。 – Ramki

関連する問題