所以我正在研究沒有多線程的應用程序。我們有一個主要的業務邏輯方法來打開休眠會話,如下所示:你能在java中每個線程只有一個hibernate會話嗎?
session = HibernateSessionFactory.getSession();
tx = session.beginTransaction();
然後執行一些輕的數據庫操作(幾個選擇)。然後調用一個我在子類中重寫的方法來執行另一個選擇。我無法將會話作爲參數傳遞,無需更新20個子類。
我試着打開一個新的會話和事務,並在完成後關閉它們,但是當我的方法被踢回到業務方法時,出現會話關閉的錯誤。我試着不關閉會話並提交事務,但那也不起作用。
現在我只是用這個,一切似乎正確本地工作:
session = HibernateSessionFactory.getSession();
tx = session.getTransaction();
,我只是關閉了會議,並回滾櫃面錯誤。我只是不確定getSession是否會始終返回已經打開的會話。我是否有權假定每個線程一次只能打開一個會話?
這裏的getSession執行:
Session session = (Session) threadLocal.get();
if (session == null || !session.isOpen())
{
if (sessionFactory == null)
{
rebuildSessionFactory();
}
session = (sessionFactory != null) ? sessionFactory.openSession() : null;
threadLocal.set(session);
}
return session;
謝謝!
https://docs.jboss.org/hibernate/core/4.2/javadocs/org/hibernate/SessionFactory.html#getCurrentSession()將實現,並且您還需要配置https://docs.jboss.org /hibernate/core/4.2/javadocs/org/hibernate/context/spi/CurrentSessionContext.html,因爲'SessionFactory.html#getCurrentSession()'實際調用'CurrentSessionContext.currentSession()'方法來返回Session。通常'CurrentSessionContext.currentSession()'實現是每個線程一個Session。 – coderz