我在JSF項目後面使用Hibernate。
在主頁面中,我有一個代表對象列表的數據表。
我使用Hibernate成功地更新了對象的屬性(在數據表中找到)。更新後,通過使用「xxx?faces-redirect = true」進行重定向來刷新頁面。我重定向頁面以避免「重複表單提交」類問題。
然後,如果我多次點擊F5,更新對象的舊屬性值可能會回到頁面。
據我所知,這是一個Hibernate會話問題。因爲如果我在每次使用後立即關閉,則不會發生此問題。但是,由於延遲獲取策略,我無法在事務處理後關閉會話。
簡而言之,休眠可能會帶來一個對象的舊值,儘管它已被成功更新。我怎樣才能避免這樣的問題?休眠不一致:會話返回舊值
PS:我懷疑關於Hibernate的緩存機制,並用我殘疾一級和二級緩存:
<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()方法中進行了必要的控制。我在哪裏犯錯誤?
我做了一個控制,以避免有兩個不同的會話。因此,如果有公開會議,我不會創建另一個會議,我將返回公開會議。因此,不應該存在兩個不同的會話。在列出,更新等時使用現有會話是否是一個問題 – 2012-04-18 06:27:29
它應該只能使用一個會話。我建議您在調試模式下啓動應用程序,並檢查您更新的實例和獲取舊值的實例是否是同一個實例(Eclipse調試器中的地址或實例ID相同) – Johanna 2012-04-18 07:42:45
我試過如你所說,我需要用我的觀察來更新這個問題。等待你的幫助,謝謝.. – 2012-04-18 10:28:20