Hibernate openSession() 和 getCurrentSession的区别

来源:互联网 发布:奇葩的淘宝评价 编辑:程序博客网 时间:2024/04/16 14:02

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(应为自己测试)

 

 

 测试代码

 

view plain
  1. package com.myj.hibernate.model;   
  2.   
  3.   import org.hibernate.HibernateException;   
  4.   
  5.   import org.hibernate.SessionFactory;   
  6.   
  7.   import org.hibernate.cfg.AnnotationConfiguration;   
  8.   
  9.   import org.hibernate.classic.Session;   
  10.   
  11.   import org.junit.AfterClass;   
  12.   
  13.   import org.junit.BeforeClass;   
  14.   
  15.   import org.junit.Test;   
  16.   
  17.   public class TeacherTest {   
  18.   
  19.   public static SessionFactory sessionFactory = null;   
  20.   
  21.   @BeforeClass   
  22.   
  23.   public static void beforeClass() {   
  24.   
  25.   try {   
  26.   
  27.   sessionFactory = new AnnotationConfiguration().configure().buildSession Factory();   
  28.   
  29.   } catch (HibernateException e) {   
  30.   
  31.   e.printStackTrace();   
  32.   
  33.   }   
  34.   
  35.   }   
  36.   
  37.   @Test   
  38.   
  39.   public void testTeacherSave() {   
  40.   
  41.   Teacher teacher = new Teacher();   
  42.   
  43.   teacher.setName("martian");   
  44.   
  45.   teacher.setAge(23);   
  46.   
  47.   Session session = sessionFactory.getCurrentSession();   
  48.   
  49.   session.beginTransaction();   
  50.   
  51.   session.save(teacher);   
  52.   
  53.   //测试getCurrentSession()方法,这里输出true,因为在一个事务内,所以取得线程中的session   
  54.   
  55.   Session session1 = sessionFactory.getCurrentSession();   
  56.   
  57.   System.out.println(session == session1);   
  58.   
  59.   //commit()之后不用close(),假如使用sessionFactory.openSession();就需要close();   
  60.   
  61.   session.getTransaction().commit();   
  62.   
  63.   //测试getCurrentSession()方法,这输出false,上一个事务已经提交,这里将重新生成一个session   
  64.   
  65.   Session session2 = sessionFactory.getCurrentSession();   
  66.   
  67.   System.out.println(session == session2);   
  68.   
  69.   }   
  70.   
  71.   @AfterClass   
  72.   
  73.   public static void afterClass() {   
  74.   
  75.   sessionFactory.close();   
  76.   
  77.   }   
  78.   
  79.   }