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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Hibernate事务管理-HibernateTransactionManager-对hibernate session的管理

發布時間:2025/3/15 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Hibernate事务管理-HibernateTransactionManager-对hibernate session的管理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

由于對SSH還停留在比較初級的應用水平上,今天在遇到一個疑惑時折騰了很久,具體問題是這樣的,

有這么一個測試方法,

1 public static void test1() { 2 ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml","daoContext.xml"); 3 MgrManager mgr = (MgrManager)ctx.getBean("mgrManager"); 4 List<EmpBean> emps = mgr.getEmpsByMgr("weblogic"); 5 for (EmpBean empBean : emps) { 6 System.out.println(empBean.getEmpName()); 7 } 8 }

其中的MgrManager是一個業務類, 提供一個根據名字查詢員工的功能, 以上方法執行完全沒有問題,

然后又有下面這個測試方法,

public static void test2() {ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml","daoContext.xml");EmployeeDao empDao = (EmployeeDao)ctx.getBean("employeeDao");Employee emp = empDao.findByName("oracle");System.out.println(emp.getSalary());}

?

test1是使用業務類間接得查詢數據庫,得到結果,而test2是通過dao直接查詢數據庫, 但是test2始終報錯說沒有數據庫session。

百思不得其解,按理說所有的bean是通過spring管理的,既然spring為業務類注入了sessionFactory, 為何dao類就沒有呢?

然后通過手工在test2中寫了如下代碼,發現是可以通過測試的,

public static void test3() {ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml","daoContext.xml");SessionFactory sf = (SessionFactory)ctx.getBean("sessionFactory");Session session = sf.openSession();List<Employee> emps = session.createQuery("select e from Employee e where e.name = 'oracle'").list();}

?

也就是說,問題不在于Spring容器中沒有sessionFactory, 而是sessionFactory沒有被open!那為什么test1的例子中的sessionFaction又open了呢?

看了配置文件半天,發現有這么關鍵的一行配置,

<aop:pointcut id="leePointcut" expression="bean(empManager)||bean(mgrManager))" />

?

另外,通過面向切面編程原理,Spring通過AOP機制為dao對象的數據操作提供事務管理,有如下配置,

<tx:advice id="txAdvice" transaction-manager="transactionManager"><!-- 配置詳細的事務語義 --><tx:attributes><!-- 所有以get開頭的方法是只讀的 --><tx:method name="get*" read-only="true" /><!-- 其他方法使用默認設置 --><tx:method name="*" /></tx:attributes> </tx:advice> <aop:config> <!-- 配置一個切入點,用來匹配empManager和mgrManager兩個Bean的所有方法的執行 --> <aop:pointcut id="leePointcut" expression="bean(empManager)||bean(mgrManager)||bean(employeeDao)" /> <!-- 指定在leePointcut切入點應用txAdvice事務增強 --> <aop:advisor advice-ref="txAdvice" pointcut-ref="leePointcut" /> </aop:config>

?

而下面這段配置是用來配置真正的事務管理類, 正是通過上面的切面配置, 將業務類與增強處理關聯起來, 同時通過下面的事務管理類進行事務管理

<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"p:sessionFactory-ref="sessionFactory" />

那么重點就在上面的transactionManager這個bean了, 通過查詢資料,初步了解到, HibernateTransactionManager這個類提供 sessionFactory的管理,為了實現數據同步,在HibernateTransactionManager內部會進行Hibernate session的open和close,并將打開的Hibernaate sesion關聯到當前的Application session,在Application中則通過getCurrentSession方式獲取爭取的打開的Hibernate session,? 從而解決某些方面的線程安全及同步問題。

由此可見,由于上面配置事務管理的切面類僅僅只是針對了業務類,即默認情況下只有業務類才用于打開的session, 由此可以理解上面的test2為什么報“沒有打開的session”錯誤了。

針對上面的配置, 我做了如下修改,

<bean id="TestManager" class="service.impl.TestManagerImpl" p:empDao-ref="employeeDao"/>

?

果然修改之后test2就能正常執行了。

?

以上僅僅涉及非常非常小的問題, 主要還是對HibernateTransactionManager的理解不夠深入造成的。

?

轉載于:https://www.cnblogs.com/fysola/p/6719800.html

總結

以上是生活随笔為你收集整理的Hibernate事务管理-HibernateTransactionManager-对hibernate session的管理的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。