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(應爲自己測試)