zoukankan      html  css  js  c++  java
  • Hibernate openSession() 和 getCurrentSession的区别 .

    Hibernate openSession() 和 getCurrentSession的区别

    getHiberanteTemplate 、getCurrentSession和OpenSession
    采用getCurrentSession()创建的Session会绑定到当前的线程中去、而采用OpenSession()则不会。

    采用getCurrentSession()创建的Session在commit或rollback后会自动关闭,采用OpenSession()必须手动关闭。

    采用getCurrentSession()需要在Hibernate.cfg.xml配置文件中加入如下配置:

    如果是本地事物,及JDBC一个数据库:

    <propety name=”Hibernate.current_session_context_class”>thread</propety>

    如果是全局事物,及jta事物、多个数据库资源或事物资源:

    <propety name=”Hibernate.current_session_context_class”>jta</propety>

    使用spring的getHiberanteTemplate 就不需要考虑事务管理和session关闭的问题:

    public List getEntityCriteria(final DetachedCriteria detachedCriteria) {
            return (List) getHibernateTemplate().executeFind(
                    new HibernateCallback() {
                        public Object doInHibernate(Session session)
                                throws HibernateException {
                            Criteria criteria = detachedCriteria
                                    .getExecutableCriteria(session);
                            return criteria.list();
                        }
                    });
        }
        public List getEntityCriteriaByPage(final DetachedCriteria detachedCriteria,final Page page) {
            return (List) getHibernateTemplate().executeFind(
                    new HibernateCallback() {
                        public Object doInHibernate(Session session)
                                throws HibernateException {
                            Criteria criteria = detachedCriteria
                                    .getExecutableCriteria(session);

                            criteria.setFirstResult(page.getFirstItemPos());
                            criteria.setMaxResults(page.getPageSize());
                            return criteria.list();
                        }
                    });
        }

    DetachedCriteria detachedCriteria = DetachedCriteria.forClass(Department.class);

    detachedCriteria.add(Restrictions.eq("eid", seacher.getEid()));//企业id为条件查询

    detachedCriteria.add(Restrictions.in("dprtid", ids));//根据id数组查询部门

    detachedCriteria.add(Restrictions.like("name", "%" + seacher.getName()+ "%"));//名称模糊查询

    getEntityCriteriaByPage(detachedCriteria,pageinfo);

    经过检查激活连接为0,被使用的连接总是为1(应为自己测试)

    package com.myj.hibernate.model; 
    
      import org.hibernate.HibernateException; 
    
      import org.hibernate.SessionFactory; 
    
      import org.hibernate.cfg.AnnotationConfiguration; 
    
      import org.hibernate.classic.Session; 
    
      import org.junit.AfterClass; 
    
      import org.junit.BeforeClass; 
    
      import org.junit.Test; 
    
      public class TeacherTest { 
    
      public static SessionFactory sessionFactory = null; 
    
      @BeforeClass 
    
      public static void beforeClass() { 
    
      try { 
    
      sessionFactory = new AnnotationConfiguration().configure().buildSession Factory(); 
    
      } catch (HibernateException e) { 
    
      e.printStackTrace(); 
    
      } 
    
      } 
    
      @Test 
    
      public void testTeacherSave() { 
    
      Teacher teacher = new Teacher(); 
    
      teacher.setName("martian"); 
    
      teacher.setAge(23); 
    
      Session session = sessionFactory.getCurrentSession(); 
    
      session.beginTransaction(); 
    
      session.save(teacher); 
    
      //测试getCurrentSession()方法,这里输出true,因为在一个事务内,所以取得线程中的session 
    
      Session session1 = sessionFactory.getCurrentSession(); 
    
      System.out.println(session == session1); 
    
      //commit()之后不用close(),假如使用sessionFactory.openSession();就需要close(); 
    
      session.getTransaction().commit(); 
    
      //测试getCurrentSession()方法,这输出false,上一个事务已经提交,这里将重新生成一个session 
    
      Session session2 = sessionFactory.getCurrentSession(); 
    
      System.out.println(session == session2); 
    
      } 
    
      @AfterClass 
    
      public static void afterClass() { 
    
      sessionFactory.close(); 
    
      } 
    
      } 
    
  • 相关阅读:
    NVelocity实现违反了LSP法则,使我的一个低级错误排查了一个下午。
    ADO.NET EF 4中 query.Where().Where()和动态组合lambda实现组合查询的不同。
    发现blend4的一个导致崩溃的BUG!!!
    代码回滚:git reset、git checkout和git revert区别和联系
    精确获取函数运行时间,精确到微秒
    在github分支上上传空文件夹
    VS2010 LINK1123:failure during conversion to COFF:file invalid or corrupt
    同步github上fork出来的分支
    未能找到任何适合于指定的区域性或非特定区域性的资源。请确保在编译时已将“XXXXX.resources”正确嵌入或链接到程序集“XX”,或者确保所有需要的附属程序集都可加载并已进行了完全签名。
    决定以后把写博客转的主要平台转到cnblogs了
  • 原文地址:https://www.cnblogs.com/Laupaul/p/2344414.html
Copyright © 2011-2022 走看看