JSFプロジェクトの背後でHibernateを使用しています。
メインページには、オブジェクトのリストを表すデータテーブルがあります。
Hibernateを使用して、オブジェクト(データテーブルにあります)のプロパティを正常に更新しました。更新後、「xxx?faces-redirect=true」を使用してリダイレクトすることでページが更新されます。「重複フォーム送信」のような問題を回避するために、ページをリダイレクトします。
次に、F5キーを数回押すと、更新されたオブジェクトの古いプロパティ値がページに戻る可能性があります。
私が理解しているように、これはHibernateセッションの問題です。使用後、すべてのセッションをすぐに閉じると、この問題は発生しません。ただし、遅延フェッチ戦略のため、トランザクション後にセッションを閉じることができません。
簡単に言うと、休止状態は、正常に更新されていても、オブジェクトの古い値をもたらす可能性があります。どうすればそのような問題を回避できますか?
ps:Hibernateのキャッシュメカニズムについて疑っていましたが、以下を使用して第1レベルと第2レベルのキャッシュを無効にしました。
<property name="hibernate.cache.use_query_cache">false</property>
<property name="hibernate.use_second_level_cache">false</property>
しかし、それも機能しませんでした。
更新:@Johannaの応答後、セッションインスタンスのIDを制御し、HibernateUtilクラスがほとんどの場合別のセッションを返すか、新しいセッションを開くことに注意しました。getSession()メソッドは次のとおりです。
public static Session getSession(){
Session se = HibernateUtil.session.get();
if(se == null)
{
se = sessionFactory.openSession();
HibernateUtil.session.set(se);
}
return se;
}
セッションができたら、そのセッションでリストや更新などすべてを行うと思っていました。getSession()メソッドで必要なコントロールを作成するためです。どこで間違えますか?