刚用 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 阅读(2071)
评论(1) 编辑 收藏