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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
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();
 
  }
 
  }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值