现在的位置: 首页 > 综合 > 正文

Hibernate openSession() 和 getCurrentSession的区别

2013年03月19日 ⁄ 综合 ⁄ 共 2257字 ⁄ 字号 评论关闭

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

BasicDataSource newDataSource = (BasicDataSource) Global._ctx
       
.getBean("datasource_"+hibernateEntityName);
       
newDataSource.getNumActive();
       
newDataSource.getInitialSize();
       
newDataSource.getMaxActive();
        newDataSource.getMaxIdle();
       
newDataSource.getNumIdle();

抱歉!评论已关闭.