剛用 hibernate 做測試的時候 , 拋了這么個異常 : org.hibernate.HibernateException: No CurrentSessionContext configured!
這是因?yàn)楝F(xiàn)在我的測試代碼里用了這么一句 : 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
Hibernate:
insert
into
person
(age, name, id)
values
(?, ?, ?)
org.hibernate.SessionException : Session was already closed
先去溜一眼數(shù)據(jù)庫 , 發(fā)現(xiàn)數(shù)據(jù)已經(jīng)正確插入 , 但后臺拋了一個 : Session was already closed 的異常 , 這個異常信息很明顯了 , 因?yàn)槲掖a中還慣性的敲了一句 : session.close();
不難想象 , 這是因?yàn)?font color="#008000" size="2">我們將 session 交給了 hibernate 來管理 , 當(dāng) session.getTransaction().commit() 事務(wù)提交完成的時候 , 此時 , session 已經(jīng)關(guān)閉 ,
我琢磨著 , 這是 hibernate 幫我們關(guān)閉的 ( 我猜的 -_- ) , 根據(jù)是 , 因?yàn)槲覀儧]有 open 過 Session , 而是直接通過 getCurrentSession() 來拿到 Session , 那 Session 是誰
幫我們 open 的呢 ? 很明顯應(yīng)該是 hibernate , 那關(guān)閉 session 的工作再由 hibernate 來完成就順理成章了 , 不然那就是 " 管殺不管埋! "
將 session.close(); 注掉 , 再次測試 , 程序一切正常. 當(dāng)然如果是用 openSession() 就不用費(fèi)這些事情了.