随笔-126  评论-247  文章-5  trackbacks-0

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

评论:
# re: org.hibernate.HibernateException: No CurrentSessionContext configured! 2013-09-09 21:50 | zhhw
细节,学习了  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: