本文是作者在对hibernate4+spring3+struts2整合中遇到的一个问题。对s2sh进行了基本的整合搭建以后,就是对事务的控制管理,将hibernate的事务交由spring管理。根据网上资料,applicationContext.xml中基本的配置如下(注意先后顺序的问题):

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans xmlns="http://www.springframework.org/schema/beans"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xmlns:p="http://www.springframework.org/schema/p"
  5. xmlns:aop="http://www.springframework.org/schema/aop"
  6. xmlns:tx="http://www.springframework.org/schema/tx"
  7. xsi:schemaLocation="
  8. http://www.springframework.org/schema/beans
  9. http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
  10. http://www.springframework.org/schema/aop
  11. http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
  12. http://www.springframework.org/schema/tx
  13. http://www.springframework.org/schema/tx/spring-tx-3.0.xsd   ">
  14. <!-- 配置数据源 Hibernate支持  -->
  15. <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" >
  16. <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
  17. <property name="username" value="scott" />
  18. <property name="password" value="tiger" />
  19. <property name="url" value="jdbc:oracle:thin:@localhost:1521:myorcl" />
  20. </bean>
  21. <!--     class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">-->
  22. <bean id="sessionFactory"
  23. class="org.springframework.orm.hibernate4.LocalSessionFactoryBean" >
  24. <property name="dataSource">
  25. <ref bean="dataSource" />
  26. </property>
  27. <property name="hibernateProperties">
  28. <props>
  29. <prop key="hibernate.dialect">
  30. org.hibernate.dialect.Oracle9Dialect
  31. </prop>
  32. <prop key="hibernate.show_sql">true</prop>
  33. <prop key="hibernate.temp.use_jdbc_metadata_defaults">false</prop>
  34. </props>
  35. </property>
  36. <property name="mappingResources">
  37. <list>
  38. <value>com/neusoft/leehom/model/Emp.hbm.xml</value>
  39. <value>com/neusoft/leehom/model/Dept.hbm.xml</value>
  40. </list>
  41. </property>
  42. </bean>
  43. <!-- 事务管理器 -->
  44. <bean id="transactionManager"
  45. class="org.springframework.orm.hibernate4.HibernateTransactionManager">
  46. <property name="sessionFactory" ref="sessionFactory"></property>
  47. </bean>
  48. <!-- 配置那些类的方法进行事务管理,需要aopalliance-1.0.jar和aspectjweaver.jar,当前com.neusoft.leehom.service包中的子包,
  49. 类中所有方法需要,还需要参考tx:advice的设置 -->
  50. <!-- 需要引入tx的命名空间 -->
  51. <!-- 这是事务通知操作,使用的事务管理器引用自 transactionManager -->
  52. <tx:advice id="txAdvice" transaction-manager="transactionManager">
  53. <tx:attributes>
  54. <!-- 指定哪些方法需要加入事务,这里懒惰一下全部加入,可以使用通配符来只加入需要的方法 -->
  55. <tx:method name="insert*" propagation="REQUIRED" />
  56. <tx:method name="update*" propagation="REQUIRED" />
  57. <tx:method name="delete*" propagation="REQUIRED" />
  58. <tx:method name="get*" propagation="REQUIRED" read-only="true"/>
  59. <tx:method name="query*" propagation="REQUIRED" read-only="true"/>
  60. <tx:method name="*" propagation="REQUIRED" />
  61. </tx:attributes>
  62. </tx:advice>
  63. <!-- 需要引入aop的命名空间 -->
  64. <aop:config>
  65. <!-- 切入点指明了在执行Service的所有方法时产生事务拦截操作 -->
  66. <aop:pointcut id="daoMethods" expression="execution(* com.neusoft.leehom.service.impl.*.*(..))" />
  67. <!-- 定义了将采用何种拦截操作,这里引用到 txAdvice -->
  68. <aop:advisor advice-ref="txAdvice" pointcut-ref="daoMethods" />
  69. </aop:config>
  70. </beans>

配置事务时应该加载aopalliance-1.0.jar和aspectjweaver.jar这两个包,这两个包是必须的。以为这样就可以对事务进行控制了,但是没有想到在测试的时候发现dao层中的save、delete等方法都不能进行持久化。最终发现是取到的session不能为sessionFactory.openSession(),而是应该为sessionFactory.getCurrentSession().同时应该在配置为文件中的propagation传播方式最好为required。这是因为当有一个方法list 传播行为为Supports,当在另一个方法getPage()(无事务)调用list方法时会抛出org.hibernate.HibernateException: No Session found for current thread 异常。

根本原因是getCurrentSession()在没有session的情况下不会自动创建一个,因此最好的解决方案是使用REQUIRED的传播行为。

现在知道事务的配置了,下面来看一下怎么使用事务管理。

dao层部分代码:

  1. package com.neusoft.leehom.dao;
  2. public class EmpDAO  {
  3. private static final Logger log = LoggerFactory.getLogger(EmpDAO.class);
  4. // property constants
  5. public static final String ENAME = "ename";
  6. public static final String JOB = "job";
  7. public static final String MGR = "mgr";
  8. public static final String SAL = "sal";
  9. public static final String COMM = "comm";
  10. private SessionFactory sessionFactory;
  11. public Session getSession() {
  12. return sessionFactory.getCurrentSession();
  13. }
  14. public SessionFactory getSessionFactory() {
  15. return sessionFactory;
  16. }
  17. public void setSessionFactory(SessionFactory sessionFactory) {
  18. this.sessionFactory = sessionFactory;
  19. }
  20. public void save(Emp transientInstance) {
  21. log.debug("saving Emp instance");
  22. try {
  23. Session session = getSession();
  24. session.save(transientInstance);
  25. log.debug("save successful");
  26. } catch (RuntimeException re) {
  27. log.error("save failed", re);
  28. throw re;
  29. }
  30. }
  31. public void delete(Emp persistentInstance) {
  32. log.debug("deleting Emp instance");
  33. try {
  34. Session session = getSession();
  35. session.delete(persistentInstance);
  36. log.debug("delete successful");
  37. } catch (RuntimeException re) {
  38. log.error("delete failed", re);
  39. throw re;
  40. }
  41. }
  42. ..........
  43. }

service层部分代码:

  1. package com.neusoft.leehom.service.impl;
  2. public class EmpManagerImpl implements IEmpManager {
  3. private EmpDAO empDao;
  4. /**
  5. * 查询所有的数据信息
  6. */
  7. public List queryAll() {
  8. return empDao.findAll();
  9. }
  10. /**
  11. * 插入数据
  12. */
  13. public void insertEmp(Emp emp){
  14. empDao.save(emp);
  15. }
  16. /**
  17. * 删除数据
  18. */
  19. public void deleteEmp(short id) {
  20. Emp emp = empDao.findById(id);
  21. empDao.delete(emp);
  22. }
  23. public void setEmpDao(EmpDAO empDao) {
  24. this.empDao = empDao;
  25. }
  26. .......
  27. }

action层部分代码:

  1. package com.neusoft.leehom.action;
  2. public class EmpAction extends ActionSupport {
  3. private IEmpManager empManager;
  4. private List list;
  5. private String message;
  6. private Emp emp;
  7. /**
  8. * 查询所有记录
  9. * @return
  10. */
  11. public String showList(){
  12. list = empManager.queryAll();
  13. message = new String("shuju来说");
  14. //System.out.println(list);
  15. return new String("ok");
  16. }
  17. /**
  18. * 删除数据
  19. * @return
  20. */
  21. public String delete(){
  22. System.out.println(emp.getEmpno());
  23. if(emp.getEmpno()!=null && !"".equals(emp.getEmpno())){
  24. empManager.deleteEmp(emp.getEmpno());
  25. }
  26. return new String("delete_ok");
  27. }
  28. /**
  29. * 修改数据
  30. * @return
  31. */
  32. public String update(){
  33. System.out.println(emp.getEmpno());
  34. empManager.updateEmp(emp.getEmpno());
  35. return new String("update");
  36. }
  37. /**
  38. * 插入数据
  39. * @return
  40. */
  41. public String insert(){
  42. System.out.println(emp.getEname()+"--"+emp.getEmpno());
  43. empManager.insertEmp(emp);
  44. return new String("insert_ok");
  45. }
  46. ........
  47. }

applicationContext.xml配置文件后面增加如下代码:

  1. <bean name="empDao" class="com.neusoft.leehom.dao.EmpDAO" >
  2. <property name="sessionFactory">
  3. <ref bean="sessionFactory" />
  4. </property>
  5. </bean>
  6. <bean name="empManager" class="com.neusoft.leehom.service.impl.EmpManagerImpl">
  7. <property name="empDao" ref="empDao"></property>
  8. </bean>
  9. <bean id="empAction" class="com.neusoft.leehom.action.EmpAction" >
  10. <property name="empManager" ref="empManager"></property>
  11. </bean>

struts.xml的部分配置内容如下:

  1. <package name="my" namespace="/" extends="struts-default">
  2. <action name="*_emp" class="empAction" method="{1}">
  3. <result name="ok">/show.jsp</result>
  4. <result name="insert_ok">/insert.jsp</result>
  5. <result name="delete_ok">/delete.jsp</result>
  6. <result name="update_ok">/update.jsp</result>
  7. </action>
  8. </package>

注意:struts也是交与spring管理,如上的struts.xml中的class=“empAction”,会到spring的配置文件找id为empAction的bean,从而找到具体的实现类。

hibernate4整合spring3事务问题的更多相关文章

  1. hibernate4整合spring3.1的过程中的异常问题

    (1)hibernate4整合spring3.1的过程中,发现了java.lang.NoClassDefFoundError: Lorg/hibernate/cache/CacheProvider异常 ...

  2. hibernate4整合spring3出现java.lang.NoClassDefFoundError: [Lorg/hibernate/engine/FilterDefinition;

    解决办法 原先:<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annota ...

  3. Struts2,Spring3,Hibernate4整合--SSH框架

    Struts2,Spring3,Hibernate4整合--SSH框架(学习中) 一.包的导入 1.Spring包 2.Hibernate 包 3.struts 包 (还欠 struts2-sprin ...

  4. spring3 hibernate4整合后无法查询数据库

    spring3和hibernate4整合后无法查询数据库,一方面是因为已经spring3中没有对hibernate4 HibernateTemplate的支持,另外一个就是需要在hibernate的配 ...

  5. 开发基础框架:mybatis-3.2.8 +hibernate4.0+spring3.0+struts2.3

    一:项目下载地址(点击 Source code(zip)) https://github.com/fzxblgong/frame_2014-12-15/releases 版本:v1.2大小:20M 二 ...

  6. Struts2+Spring4+Hibernate4整合超详细教程

    Struts2.Spring4.Hibernate4整合 超详细教程 Struts2.Spring4.Hibernate4整合实例-下载 项目目的: 整合使用最新版本的三大框架(即Struts2.Sp ...

  7. Mybatis3.2.1整合Spring3.1

    Mybatis3.2.1整合Spring3.1 根 据官方的说法,在ibatis3,也就是Mybatis3问世之前,Spring3的开发工作就已经完成了,所以Spring3中还是没有对 Mybatis ...

  8. Maven整合Spring3.0+Mybatis3.2+Struts2.3+查找坐标+jar包依赖(五)

    依赖传递 只添加了一个struts2-core依赖,发现项目中出现了很多jar,这种情况 叫 依赖传递

  9. 画蛇添足-记spring3 hibernate4整合时遇到问题的处理办法

    最近在来到一个新公司,使用新的spring3,hibernate4框架,在使用注解事务总是不起作用. 首先看配置文件,然后再讲解. 首先是springmvc-servlet.xml,这个配置文件是se ...

随机推荐

  1. (一)u-boot-nand.bin的下载

    编译.连接好u-boot-nand.bin首先想到是如何下载到OK6410上,有3种方法: (1)dnw方法 (2)tftp方法 (3)sd卡方法 3种方法各有优点和缺点,下面逐一介绍: 一.dnw方 ...

  2. SQL语句 - 嵌套查询

    嵌套查询的意思是,一个查询语句(select-from-where)查询语句块可以嵌套在另外一个查询块的where子句中,称为嵌套查询.其中外层查询也称为父查询,主查询.内层查询也称子查询,从查询. ...

  3. 初探Stage3D(二) 了解AGAL

    关于本文 本文并无打算事无巨细的介绍一遍AGAL,仅仅是对现有文档的一些理解及汇总,所以请先阅读相参考文档 AGAL概念 参考资料 http://www.adobe.com/devnet/flashp ...

  4. 在Unity3D的网络游戏中实现资源动态加载

    用Unity3D制作基于web的网络游戏,不可避免的会用到一个技术-资源动态加载.比如想加载一个大场景的资源,不应该在游戏的开始让用户长时间等待全部资源的加载完毕.应该优先加载用户附近的场景资源,在游 ...

  5. apk签名

    参考:http://stackoverflow.com/questions/13578134/how-to-automate-keystore-generation-using-the-java-ke ...

  6. HTTP 头部详细解释

    HTTP 头部解释 ================================================   Accept 告诉WEB服务器自己接受什么介质类型,*/* 表示任何类型,ty ...

  7. pdf嵌入字体

    论文提交时,要求所有的字体都是嵌入的,为这个问题折腾了很久,发现了一个很好的答案,记一下: http://stackoverflow.com/questions/4231656/how-do-i-em ...

  8. C#参考:Linq 概述

    Linq (Language Integrated Query,语言集成查询),是微软公司提供的一项新技术,它能够将查询功能引入到.NET 3.5 所支持的编程语言中,例如C#,Visual Basi ...

  9. DbUtils使用例子

    DbUtils: JDBC Utility Component Examples This page provides examples that show how DbUtils may be us ...

  10. Cwinux简介及用法简述

    我在我的个人博客上发表了一篇文章 Cwinux简介及用法简述 http://apprentice89.com/cwinux_introduction_and_use/