关于spring事务管理的问题

问题描述

最近刚学spring,在事务管理这自己写了个小例子,可是老运行不通过,请大虾看看。下面是我的代码:首先是DAO接口,UserDaoService:package org.ultimania.dao;import java.util.List;import org.ultimania.model.User;public interface UserDaoService {public List<User> getAll();}接口实现,UserDaoImpl:package org.ultimania.dao;import java.util.List;import org.springframework.orm.hibernate3.support.HibernateDaoSupport;import org.springframework.transaction.annotation.Propagation;import org.springframework.transaction.annotation.Transactional;import org.ultimania.model.User;public class UserDaoImpl extends HibernateDaoSupport implements UserDaoService{@SuppressWarnings("unchecked")@Transactional(propagation=Propagation.REQUIRED)public List<User> getAll(){List<User> list = this.getHibernateTemplate().find("from User");return list;}}接下来是我的测试代码:package org.ultimania.test;import java.util.List;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;import org.ultimania.dao.UserDaoImpl;import org.ultimania.dao.UserDaoService;import org.ultimania.model.User;public class UserDaoTest {public static void main(String[] args){List<User> list = null;UserDaoService userDaoImpl ;ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");userDaoImpl = (UserDaoService)ctx.getBean("userDao");try{list = userDaoImpl.getAll();}catch(Exception e){e.printStackTrace();}finally{if(list==null){System.out.println("faled");}else{System.out.println(list.size());}}}}然后是spring配置文件,applicationContext.xml:<?xml version="1.0" encoding="UTF-8"?><beansxmlns="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:p="http://www.springframework.org/schema/p"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-2.5.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"><tx:annotation-driven transaction-manager="transactionManager" /><bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"><property name="sessionFactory"><ref bean="sessionFactory"/></property></bean><bean id="sessionFactory"class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"><property name="configLocation"value="classpath:hibernate.cfg.xml"></property></bean><bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate"><property name="sessionFactory"><ref bean="sessionFactory"/></property></bean><bean id="userDao" class="org.ultimania.dao.UserDaoImpl"><property name="hibernateTemplate"><ref bean="hibernateTemplate" /></property></bean></beans>我用的是注解式事务管理的方式,hibernate的东西是没错的,现在的问题是如果我在UserDaoImpl不添加事务声明@Transactional(propagation=Propagation.REQUIRED),运行是没有错误的,可是我一添加这句声明,运行就错了。下面是异常信息:Exception in thread "main" java.lang.AbstractMethodError: org.springframework.orm.hibernate3.SpringTransactionFactory.beginTransaction(Lorg/hibernate/jdbc/JDBCContext;Lorg/hibernate/transaction/TransactionFactory$Context;)Lorg/hibernate/Transaction;at org.hibernate.jdbc.JDBCContext.beginTransaction(JDBCContext.java:271)at org.hibernate.impl.SessionImpl.beginTransaction(SessionImpl.java:1079)at org.springframework.orm.hibernate3.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:558)at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:374)at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:263)at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:101)at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204)at $Proxy5.getAll(Unknown Source)at org.ultimania.test.UserDaoTest.main(UserDaoTest.java:19)这个问题困扰我好久了,一直没有解决,只能请大虾们帮我看看了。 问题补充:soartju 写道

解决方案

引用@Transactional(propagation=Propagation.REQUIRED),运行是没有错误的,可是我一添加这句声明,运行就错了相应的jar 包 是否加入?annotation 的版本和hibernate 版本是否匹配?
解决方案二:
<bean id="userDao" class="org.ultimania.dao.UserDaoImpl"><property name="hibernateTemplate"><ref bean="hibernateTemplate" /></property></bean> 确定是org.ultimania.dao.UserDaoImpl"?UserDaoService userDaoImpl; 你先声明成UserDaoImpl userDaoImpl;试试
解决方案三:
UserDaoService userDaoImpl ;ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");userDaoImpl = (UserDaoService)ctx.getBean("userDao"); 改成userDaoImpl = (UserDaoImpl)ctx.getBean("userDao"); 试一下。
解决方案四:
查询的动作加上这个propagation=Propagation.REQUIRED 肯定不正确呀!!应该是readOnly 吧。。

时间: 2024-09-18 15:15:31

关于spring事务管理的问题的相关文章

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

联合军种作战的混乱 Spring 抽象的 DAO 体系兼容多种数据访问技术,它们各有特 色,各有千秋.像 Hibernate 是非常优秀的 ORM 实现方案,但对底层 SQL 的控制不太方便: 而 iBatis 则通过模板化技术让您方便地控制 SQL,但没有 Hibernate 那样高的开发效率:自 由度最高的当然是直接使用 Spring JDBC 莫属了,但是它也是最底层的,灵活的代价是代码的 繁复.很难说哪种数据访问技术是最优秀的,只有在某种特定的场景下,才能给出答案.所以 在一个应用中,往

Spring事务管理高级应用难点剖析,第1部分

概述 Spring 最成功,最吸引人的地方莫过于轻量级的声明式事务管理,仅此一点,它就宣告了 重量级 EJB 容器的覆灭.Spring 声明式事务管理将开发者从繁复的事务管理代码中解脱出来 ,专注于业务逻辑的开发上,这是一件可以被拿来顶礼膜拜的事情.但是,世界并未从此消停 ,开发人员需要面对的是层出不穷的应用场景,这些场景往往逾越了普通 Spring 技术书籍的 理想界定.因此,随着应用开发的深入,在使用经过 Spring 层层封装的声明式事务时,开发 人员越来越觉得自己坠入了迷雾,陷入了沼泽,

分布式事务系列(1.1)Spring事务管理器PlatformTransactionManager

1 系列目录 分布式事务系列(开篇)提出疑问和研究过程 分布式事务系列(1.1)Spring事务管理器PlatformTransactionManager源码分析 分布式事务系列(1.2)Spring事务体系 分布式事务系列(2.1)分布式事务模型与接口定义 分布式事务系列(3.1)jotm的分布式案例 分布式事务系列(3.2)jotm分布式事务源码分析 分布式事务系列(4.1)Atomikos的分布式案例 2 jdbc事务 2.1 例子 public void save(User user)

spring 事务管理让我费解的地方

问题描述 在用springmvc时,用到了spring事务管理<beanid="dataSource"class="org.apache.commons.dbcp.BasicDataSource"destroy-method="close"><propertyname="driverClassName"><value>${jdbc.driver}</value></prop

spring事务管理的一些注意点

总结一些自己最近在使用spring事务管理时碰到的一些注意点   一.关于目标对象内部方法自我调用时的一些情形和存在的问题 1.情形1:只给b方法上加事务注解,a方法上不加 目标类的接口和实现代码示例: public interface AService {     public void a();     public void b(); }   @Service() public class AServiceImpl implements AService{     public void

Spring事务管理--多个ORM框架在使用时的情况分析

   公司的项目已经接近尾声了,总结一下项目中用到的技术,我发现项目中的有些东西还是挺模糊的,只是知道这么用就行了.并不清楚其中的原理.由于公司的项目比较老,是7年前的一个项目了,中间一直有人在维护,也是在这个过程中不断融入了新的东西,比如就项目的持久化这块来说,就用了ibatis.mybatis.hibernate.spring JDBC四种混合的框架.究其原因只能说是历史遗留问题,就不做过多的解释了.但是这么多持久化的框架如何协同工作的,尤其是事务的控制,一个系统中使用如此多的持久化框架是,

并发-mybatis spring事务管理问题

问题描述 mybatis spring事务管理问题 mybatis把一个对象查询出来,让后在对这个对象做相关业务操作,然后再保存这个对象, 这样有个问题就是,在并发情况下,这个对象不是数据库最新的数据,有方法可以避免吗? 解决方案 在对象查询前面做一次对象状态更新,标记正要更新的状态.然后再查询出来,做业务操作,保存时把标记复原. 解决方案二: 可以加锁,或者线程,锁住对象就行了 解决方案三: 可以加锁,或者线程,锁住对象就行了

Spring事务管理只对出现运行期异常进行回滚_java

一.结论 Spring的事务管理默认只对出现运行期异常(java.lang.RuntimeException及其子类)进行回滚. 如果一个方法抛出Exception或者Checked异常,Spring事务管理默认不进行回滚. 关于异常的分类一下详细介绍: 1.基本概念 看java的异常结构图  Throwable是所有异常的根,java.lang.Throwable Error是错误,java.lang.Error Exception是异常,java.lang.Exception 2.Excep

Spring事务管理回顾——基本概念

BackGround:            最近一直在面试,感觉spring的事务配置问的挺多的,再扯出来好好瞅瞅,争取做到秒杀面试官. 一,事务的基本概念        什么是事务?               逻辑上的一组操作,这组操作要么全都成功,要么全都失败.例如,我购买完一个课程,要进行支付,需要首先去我的账户表中减去需要支付的金额,然后更新订单状态,支付才算是成功,那么支付跟更新订单状态就要放在一个事务里面执行,要么全成功,要么全失败,不能出现那种我买了课程,结果订单还显示我未支付

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

本文是"Spring 事务管理高级应用难点剖析" 系列文章的第 3 部分,作者将继续深入剖析在实际 Spring 事务管理应用中容易遇见的一些难点,包括在使用 Spring JDBC 时如果直接获取 Connection,哪些情况会造成数据连接的泄漏与如何应对,以及除 Spring JDBC 外,其它数据访问技术数据连接泄漏的应对方案.   概述 对于应用开发者来说,数据连接泄漏无疑是一个可怕的梦魇.如果存在数据连接泄漏问题,应用程序将因数据连接资源的耗尽而崩溃,甚至还可能引起数据库的