日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Hibernate openSession() 和 getCurrentSession的区别 .

發(fā)布時間:2025/6/15 编程问答 13 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Hibernate openSession() 和 getCurrentSession的区别 . 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

getHiberanteTemplate 、getCurrentSession和OpenSession
采用getCurrentSession()創(chuàng)建的Session會綁定到當(dāng)前的線程中去、而采用OpenSession()則不會。

采用getCurrentSession()創(chuàng)建的Session在commit或rollback后會自動關(guān)閉,采用OpenSession()必須手動關(guān)閉。

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

如果是本地事物,及JDBC一個數(shù)據(jù)庫:

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

如果是全局事物,及jta事物、多個數(shù)據(jù)庫資源或事物資源:

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

使用spring的getHiberanteTemplate 就不需要考慮事務(wù)管理和session關(guān)閉的問題:

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()));//企業(yè)id為條件查詢

detachedCriteria.add(Restrictions.in("dprtid", ids));//根據(jù)id數(shù)組查詢部門

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

getEntityCriteriaByPage(detachedCriteria,pageinfo);

經(jīng)過檢查激活連接為0,被使用的連接總是為1(應(yīng)為自己測試)

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,因為在一個事務(wù)內(nèi),所以取得線程中的session   Session session1 = sessionFactory.getCurrentSession();   System.out.println(session == session1);   //commit()之后不用close(),假如使用sessionFactory.openSession();就需要close();   session.getTransaction().commit();   //測試getCurrentSession()方法,這輸出false,上一個事務(wù)已經(jīng)提交,這里將重新生成一個session   Session session2 = sessionFactory.getCurrentSession();   System.out.println(session == session2);   }   @AfterClass   public static void afterClass() {   sessionFactory.close();   }   }

總結(jié)

以上是生活随笔為你收集整理的Hibernate openSession() 和 getCurrentSession的区别 .的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。