今天弄了一天的hibernate添加事务的问题

首先,建立的是一个java工程,把hibernate添加进工程里,很容易就可以写一个增删改查的方法。索性就多加点东西,把接口,抽象类也加到里面,自己看着也舒服点,然后写的时候了,想把spring的功能加进来,想利用spring的aop配置事务,做到事务层配置可控制到service层,这样的话,就可以专注业务实现,一个业务方法就是一个事务。

首先看配置好的application.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="
       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd
       ">

<bean id="sessionFactory"
        class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <property name="configLocation" value="classpath:hibernate.cfg.xml"></property>
    </bean>

<bean id="iStudentDAO" class="com.wxw.model.StudentDAO">
        <property name="sessionFactory" ref="sessionFactory"></property>
    </bean>
   
   
    <bean id="studentServiceImpl" class="com.wxw.service.StudentServiceImpl">
        <property name="iStudentDao" ref="iStudentDAO"></property>
    </bean>

<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory"></property>
    </bean>

<tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="*" propagation="REQUIRED"/>
        </tx:attributes>
    </tx:advice>

<!-- 事务控制在service层 -->
     <aop:config>
         <aop:pointcut id="interceptorPointCuts" expression="execution(* com.wxw.service.*.*(..))" />
         <aop:advisor advice-ref="txAdvice" pointcut-ref="interceptorPointCuts" />       
     </aop:config>

</beans>

注意点:

  • 自己定义的bean一定要是接口的形式,为什么了,因为spring的配置针对的接口,如果bean配置的实体类,会出现异常
    1. 自己定义的bean也不能是abstract类,否则一样是报错。也不能在abstract类里注入接口等一些操作了
    2. 添加spring aop需要添加对应的jar包外,还需要在xml头部加一些xsd信息,否则编译器会报错,这个是常识性的问题,但却很隐蔽,还有别把头信息版本搞错了,虽然有时候3.0和3.1的版本中有细微的差别,一旦出问题,那可是致命的,找都无法找。
    3. 定义aop:config里的expression的信息时,一定要写对execution()这里面的表达式,这个是有讲究的,自己好好注意一下
    4. 然后是sessionFactory的问题,只能定义一个sessionFactory,别初始化一次,然后又注入一次,两个不同的session事务就不执行了,我测试了一下,确实是不能成功,都生成了sql语句了,但是事务却没有提交成功,而且执行起来,两条sql时间间格差很多,有2秒钟左右,我写的保存语句就是连着写的,本来应该是同一时间出现的。所以,这点也要有明确的思维
    5. 然后就是保存时候的问题,自己加transation加在代码里,能够提交成功,但配置的事务就是没起作用,肯定是配置写的不对,仔细检查。然后就是一直报save is not valid without active transaction这个错误,我试了好多办法,终于在一个论坛找到了,把hibernate.cxf.xml文件里的一个<property name="hibernate.current_session_context_class">thread</property>注释掉便可,前提是你其他的方的配置写正确了。这个地方原来是hibernate原因网上说的是跟spring接管事务的起冲突了,按照我的理解就是spring接管了hibernate的所有数据访问配置
    6. 事务对RuntimeException默认是会回滚的,而且还不能把这个异常用try捕获,否则事务先提交的一样会成功,后提交的也一样会成功,只有throw了之后就事务就会回滚
    7. 最后的最重要的一点就是,遇到错误不要慌,虽然我也花了整整一天时间,最少有7-8个小时才把这个问题解决,一定要沉住气,哪里出错,先想想,一些明显的错误,上网一查,基本上都能解决,有些问题肯定是你需要花时间去想的,好了,问题解决,花了这么多时间,难得,感觉不错!

hibernate添加spring 事务管理注意问题记录的更多相关文章

  1. Spring事务管理(转)

    1 初步理解 理解事务之前,先讲一个你日常生活中最常干的事:取钱. 比如你去ATM机取1000块钱,大体有两个步骤:首先输入密码金额,银行卡扣掉1000元钱:然后ATM出1000元钱.这两个步骤必须是 ...

  2. Spring 事务管理高级应用难点剖析--转

    第 1 部分 http://www.ibm.com/search/csass/search/?q=%E4%BA%8B%E5%8A%A1&sn=dw&lang=zh&cc=CN& ...

  3. 【转】Spring事务管理

    原文链接 在 Spring 中,事务是通过 TransactionDefinition 接口来定义的.该接口包含与事务属性有关的方法.具体如清单 1 所示: 清单 1. TransactionDefi ...

  4. Spring事务管理(详解+实例)

    1 初步理解 理解事务之前,先讲一个你日常生活中最常干的事:取钱. 比如你去ATM机取1000块钱,大体有两个步骤:首先输入密码金额,银行卡扣掉1000元钱:然后ATM出1000元钱.这两个步骤必须是 ...

  5. 【Spring】11、Spring事务管理

    写这篇博客之前我首先读了<Spring in action>,之后在网上看了一些关于Spring事务管理的文章,感觉都没有讲全,这里就将书上的和网上关于事务的知识总结一下,参考的文章如下: ...

  6. spring事务管理(详解和实例)

    原文地址: 参考地址:https://blog.csdn.net/yuanlaishini2010/article/details/45792069 写这篇博客之前我首先读了<Spring in ...

  7. (转)Spring事务管理(详解+实例)

    文章转自:http://blog.csdn.net/trigl/article/details/50968079 写这篇博客之前我首先读了<Spring in action>,之后在网上看 ...

  8. spring入门到放弃——spring事务管理

    Spring事务提供了两种管理的的方式:编程式事务和声明式事务 简单回顾下事务: 事务:逻辑上的一组操作,组成操作的各个单元,要么全部成功,要么全部失败. 事务特性: 原子性:一个事务包含的各个操作单 ...

  9. Spring 事务管理高级应用难点剖析: 第 2 部分

    本文是“Spring 事务管理高级应用难点剖析” 系列文章的第 2 部分,作者将继续深入剖析在实际 Spring 事务管理应用中容易遇见的一些难点,包括混合使用多种数据访问技术(如 Spring JD ...

随机推荐

  1. Mac下一个/usr/include失踪

    Mac升级到Yosemite后,突然发现vim的YouCompleteMe代码提示所以空头支票成员,排查了一下,原本/usr/include目录中缺少.所有的C/C++头文件不见了. .. 第一次发现 ...

  2. c语言mysql api

    原文:c语言mysql api 1.mysql_affected_rows()            //返回上次UPDATE.DELETE或INSERT查询更改/删除/插入的行数. 2.mysql_ ...

  3. :link,:visited,:focus,:hover,:active详解

    原文::link,:visited,:focus,:hover,:active详解 CSS 又名 层叠样式表,所谓层叠,就是后面的样式会覆盖前面的样式,所以在样式表中,各样式排列的顺序很有讲究.   ...

  4. unity资源

    unity资源集中贴 1.unity经验之谈 http://jingyan.baidu.com/article/19192ad820f17be53e570715.html 2.百度网盘,分享了一点模型 ...

  5. 用持续集成工具Travis进行构建和部署

    用持续集成工具Travis进行构建和部署 用持续集成工具Travis进行构建和部署 摘要:本文简单说明了如何使用持续集成工具Travis进行构建和部署的过程. 1. 概述 持续集成(Continuou ...

  6. jQuery EasyUI API - Layout - Layout[原创汉化官方API]

    最近在学习jQuery EasyUI,发现中文的文档好少,部分文档不错但它是鸟语的,为了大家也为了自己学习吧,汉化做一下笔记. 有没有说清楚的,或者翻译不正确的地方还请大家谅解指出.. 由于工作时间原 ...

  7. Spring IOC 之ApplicationContext的其他功能

    正如上面章节所介绍的那样, org.springframework.beans.factory 包提供了管理和操作beans的 基本功能. org.springframework.context包增加 ...

  8. 使用SQL Server 2005数据库管理工具 - 初学者系列 - 学习者系列文章

    本文讲述使用SQL Server 2005 Express数据库管理工具的使用. 1.打开数据库管理工具 2.选择下面的SQL Server 身份验证,因为在安装数据库的时候设置了sa的密码. 3.选 ...

  9. js实现文字横向滚动

    页面布局      <div id="scroll_div" class="fl">         <div id="scroll ...

  10. scala lift环境搭建

    Intellij IDEA + scala插件 工欲善其事,必先利其器! 学习scala已经有一段时间了,对scala这门语言爱不释手,但同时也为scala糟糕的IDE工具支持感到懊恼(我是一个100 ...