剛用 hibernate 做測試的時候 , 拋了這么個異常 : org.hibernate.HibernateException: No CurrentSessionContext configured!
這是因為現在我的測試代碼里用了這么一句 : Session session = HibernateUtil.getSessionfactory().getCurrentSession();
以前一直是自己去 open Session 的 : Session session = HibernateUtil.getSessionfactory().openSession();
去翻 hibernate 的幫助文檔 , 在文檔的第一章寫道 :
<!-- Enable Hibernate's automatic session context management -->
<property name="current_session_context_class">thread</property>
從它的注釋中不難理解這句的配置 , 它是將 session 交給 hibernate 自動幫我們管理 , 將這句配置拷貝到 hibernate.cfg.xml 配置文件中 ,
重新測試程序 , 不料后臺又拋了一個很有意思的異常信息 :
Not binding factory to JNDI, no JNDI name configured
Hibernate:
insert
into
person
(age, name, id)
values
(?, ?, ?)
org.hibernate.SessionException : Session was already closed
先去溜一眼數據庫 , 發現數據已經正確插入 , 但后臺拋了一個 : Session was already closed 的異常 , 這個異常信息很明顯了 , 因為我代碼中還慣性的敲了一句 : session.close();
不難想象 , 這是因為我們將 session 交給了 hibernate 來管理 , 當 session.getTransaction().commit() 事務提交完成的時候 , 此時 , session 已經關閉 ,
我琢磨著 , 這是 hibernate 幫我們關閉的 ( 我猜的 -_- ) , 根據是 , 因為我們沒有 open 過 Session , 而是直接通過 getCurrentSession() 來拿到 Session , 那 Session 是誰
幫我們 open 的呢 ? 很明顯應該是 hibernate , 那關閉 session 的工作再由 hibernate 來完成就順理成章了 , 不然那就是 " 管殺不管埋! "
將 session.close(); 注掉 , 再次測試 , 程序一切正常. 當然如果是用 openSession() 就不用費這些事情了.
posted on 2012-10-03 21:24
fancydeepin 閱讀(2078)
評論(1) 編輯 收藏