HIbernate中openSession和getCurrentSession

??这两者的区别网上很多资源,我这里就copy一下了,然后有点问题的是今天遇到的问题。

??openSession和getCurrentSession的根本区别在于有没有绑定当前线程,所以,使用方法有差异:

* openSession没有绑定当前线程,所以,使用完后必须关闭,

* currentSession和当前线程绑定,在事务结束后会自动关闭。



??今天在复习Hibernate时,看到Hibernate检索方式的时候,写了一个小例子:

@Test
    public void query01() {
        SessionFactory sessionFactory = new Configuration().configure()
                .buildSessionFactory();
        Session session = sessionFactory.getCurrentSession();
        /*
         * 使用getCurrentSession()必须开启事物,否则抛出异常org.hibernate.HibernateException:
         * createQuery is not valid without active transaction
         */
        session.beginTransaction();
        Query query = session.createQuery("from Employee");
        System.out.println(query.list());
    }

??hibernate.cfg.xml中配置了

<property name="current_session_context_class">thread</property>

??这里已经写了注释,我遇到的问题就是这个,在进行查询的时候使用getCurrentSession竟然抛出 createQuery is not valid without active transaction的异常,觉得很奇怪。

??按照文档说:getCurrentSession()方法获取Session的机制应该是

“在getCurrentSession() 被调用的时候,实际被执行的方法是CurrentSessionContext.currentSession() 。在currentSession() 执行时,如果当前 Session为空,currentSession会调用 SessionFactory 的 openSession。”

??现在的状态是符合Session为空的情况,那么就应该通过openSession()方法产生一个Session,但是却抛出了异常。

??Google了一下,找到一篇博文:http://liusu.iteye.com/blog/380397

??里面介绍了关于这个问题,英文有点水,理解就看自己了。

??我的感觉就是出现这种情况感觉openSession相对来说还好用一些了。

    @Test
    public void query02() {
        SessionFactory sessionFactory = new Configuration().configure()
                .buildSessionFactory();
        Session session = sessionFactory.openSession();;
        try {
            Query query = session.createQuery("from Employee");
            System.out.println(query.list());
        } catch (HibernateException e) {
            e.printStackTrace();
        }finally{
            session.close();
        }
    }

??可能比较片面,但是目前还没有到那个层面,慢慢来,就像之前看这两个的区别一样,一直看不懂,慢慢的积累到一定层度就会很好理解了。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-11 21:24:20

HIbernate中openSession和getCurrentSession的相关文章

hibernate 的SessionFactory的getCurrentSession 与 openSession() 的区别

1 getCurrentSession创建的session会和绑定到当前线程,而openSession不会. 2 getCurrentSession创建的线程会在事务回滚或事物提交后自动关闭,而openSession必须手动关闭 这里getCurrentSession本地事务(本地事务:jdbc)时 要在配置文件里进行如下设置 * 如果使用的是本地事务(jdbc事务) <property name="hibernate.current_session_context_class"

Hibernate常见错误:java.lang.NoSuchMethodError: org.hibernate.SessionFactory.openSession()Lorg/hibe

hibernate4 与 spring3有点冲突 http://blog.csdn.net/gyflyx/article/details/7632645 整合NoSuchMethodError错误 and 升级Spring3.1RC2 和Hibernate4.0.0CR7遇到的一些问题及解决 2012-02-20 10:33:28|  分类: 编程_SSH |字号 订阅 我使用的是hibernate4和spring3,然后报的错误是 java.lang.NoSuchMethodError: or

openSession和getCurrentSession的比较

在比较openSession和getCurrentSession这两个方法之前,我们先认识一下这两个方法. 在进行配置信息管理时,我们一般进行一下简单步骤: 1 Configuration cfg = new Configuration(); // 获得配置信息对象 2 SessionFactory sf = cfg.configure().buildSessionFactory(); //解析并建立Session工厂 3 4 1. Session session = sf.getCurrent

hibernate中session的获取使用以及其他注意事项

hibernate中session的获取使用以及其他注意事项 前言:工作时,在同时使用Hibernate的getSession().getHibernateTemplate()获取Session后进行数据查询时不是出现了"session is close"异常就是出现其他异常问题,痛定思痛,决定收集并整理相关资料,方便今后的使用. 一.session的获取 在hibernate中的Session对象通过SessionFactory来管理,可以通过使用openSession ().get

Hibernate入门(四)之hibernate中session的创建方式

为什么要专注于session的创建方式 在有些场景必须关注session的创建,比如说在银行转账操作的时候,两个账户转账必须在同一个session中 如上面所示,账户1钱没了,账户2钱却没有到,原因就在于两者不再同一个事务当中,不能实现事务的回滚. getCurrentSession 说明: 1.产生方式的说明 1.先检查当前线程中是否有session 2.如果当前线程中有session,则把session提取出来,直接使用 3.如果当前线程中没有session,则采用openSession方法

hibernate中session线程安全的实现

在hibernate中session是使用ThreadLocal实现线程安全的. ThreadLocal并不是一个Thread,而是一个线程副本,ThreadLocal为每个使用该变量的线程提供一个变量副本,线程修改自己的变量副本不会影响其他线程的变量副本 ThreadLocal有四个方法: set():设置当前线程的局部变量的值 get():获取当前线程的局部变量的值 remove():将当前线程局部变量的值删除,此方法不必显示的调用,因为局部变量自有垃圾回收器去清理 initialValue

delete update在hibernate中的使用

之前在hibernate中使用了save方法,使用getCurrentSession不需要自己管理事务,很方便. sessionFactory.getCurrentSession().save(applicationInfo); 同事update和delete也有两种类似方法: Session session = sessionFactory.getCurrentSession(); session.update(applicationInfo); session.flush(); Sessio

由openSession、getCurrentSession和HibernateDaoSupport浅谈Spring对事物的支持

由openSession.getCurrentSession和HibernateDaoSupport浅谈Spring对事物的支持 Spring和Hibernate的集成的一个要点就是对事务的支持,openSession.getCurrentSession都是编程式事务(手动设置事务的提交.回滚)中重要的对象,HibernateDaoSupport则提供了更方便的声明式事务支持. Hibernate中最重要的就是Session对象的引入,它是对jdbc的深度封装,包括对事务的处理,Session对

4.openSession() 、 getCurrentSession()与session上下文

openSession()每次都打开一个新的session,用了openSession(),要记得close()掉 getCurrentSession()在session上下文(hibernate配置文件中的current_session_context_class有设定)找session,如果有,则返回该session,否则会新建一个session.不需要调用close(),transaction commit后会自动关闭.openSession()与getCurrentSession()不能