1. 程式人生 > >org.hibernate.SessionException: Session is closed! 異常解決方法

org.hibernate.SessionException: Session is closed! 異常解決方法

    今天寫了一個SpringMVC的小應用,功能很簡單,在使用者登入的時候如果發現自己沒有使用者名稱和密碼就點選註冊,跳轉到註冊頁面註冊一個,如果註冊成功,自動跳轉到登入頁面,否則跳到錯誤頁面。

    問題出現在註冊成功後登入的時候。如果直接登入不存在這個問題。問題的異常資訊如下:

org.hibernate.SessionException: Session is closed! 
    其他更多的異常資訊就不貼出來了,首先想到的是在第一次使用了session的時候,採取了關閉措施,導致第二次使用的時候session是關閉的,所以報出這個錯誤。於是檢視DAO層程式碼裡面是如何使用session的。

1)建立session


private static Session session = HibernateUtil.getSessionFactory().getCurrentSession()
2)使用session
try
{
	session.beginTransaction();
	String sql = "SELECT USERNAME,PASSWORD FROM CUSTOMER " +
	"WHERE USERNAME = '" + customer.Username +"' AND PASSWORD = '"+customer.Password+"';";
	Query query = session.createSQLQuery(sql);
	result = query.list().size();
	session.getTransaction().commit();
}catch(Exception ex){
	ex.printStackTrace();
}
第二個方法裡面使用的方式也是這樣,發現並沒有關閉session

經過查閱資料發現:

如果使用的是getCurrentSession來建立session的話,在commit後,session就自動被關閉了, 
也就是不用再session.close()了。但是如果使用的是openSession方法建立的session的話, 
那麼必須顯示的關閉session,也就是呼叫session.close()方法。這樣commit後,session並沒有關閉 

所以,解決辦法就有了!

private static Session session = HibernateUtil.getSessionFactory().openSession()

使用這種形式的session問題就得到了解決!