`
ssg108
  • 浏览: 51420 次
  • 性别: Icon_minigender_2
  • 来自: 郑州
社区版块
存档分类
最新评论

spring 事务配置

阅读更多

      今天,将hibernate和spring结合使用,用单元测试调用一个保存方法,hibernate的插入sql打印出来了,单元测试也显示绿色条,成功了,可查询表时,表里就是没数据,原以为是数据没有提交,只是插入了,所以将mysql的隔离级别设置成未提交读取,可是数据还是没有出来,郁闷中,请教了一位大师,他说,如果在spring中不配置事务,spring中默认是回滚状态,难怪我数据一直查询不出来,后来将spring中事务配置上去,如下:

<!-- 配置事务的传播特性 -->
	<tx:advice id="txAdvice" transaction-manager="transactionManager">
		<tx:attributes>
			<tx:method name="add*" propagation="REQUIRED"/>
			<tx:method name="del*" propagation="REQUIRED"/>
			<tx:method name="modify*" propagation="REQUIRED"/>
			<tx:method name="*" read-only="true"/>
		</tx:attributes>
	</tx:advice>

	<!-- 那些类的哪些方法参与事务 -->
	<aop:config>
		<aop:pointcut id="allManagerMethod" expression="execution(* com.bjsxt.hibernate.UserManager.*(..))"/>
		<aop:advisor pointcut-ref="allManagerMethod" advice-ref="txAdvice"/>
	</aop:config>

  配置之后,又出现了一个问题,类转换错误,代码是这样的:

	protected void setUp() throws Exception {
		BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext-*.xml");
	    userManager = (UserManager)factory.getBean("userManager");
		
	}

 报错原因是说$Proxy1  不能转换成UserManager类,为什么呢?

事先说明一下,我这个测试和以往的项目不同,以前用spring bean的时候,都是先写一个接口,然后写一个类来实现这个接口,而我,为了偷懒,没有写接口,直接写的是一个类,实现了HibernateDaoSupport 类。

问题就出在没写接口上,听大师讲,原因是因为spring中有两种代理,一种是jdk的动态代理,一种是用cglib 代理,。。。。。。。。。,由于我的类继承的是hibernateDaoSupport,所以生成的代理类,是HibernateDaoSupport的子类,而我的类,也是。。。的子类,所以两个类不能转换,怎么办呢?

事情总会有解决方法的。

在配置文件中配置了一项:

<!-- 那些类的哪些方法参与事务 -->
	<aop:config  proxy-target-class="true">
		<aop:pointcut id="allManagerMethod" expression="execution(* com.bjsxt.hibernate.UserManager.*(..))"/>
		<aop:advisor pointcut-ref="allManagerMethod" advice-ref="txAdvice"/>
	</aop:config>

 
 多配置了一项这个内容,意思是生成代理类的时候,直接在现有类上生成子类,这样就没有问题了。

 

修改了这么多,测试了一下,终于,问题解决了,数据有了,呵呵。

 

摘自spring framework   6.6章 代理部分的内容:

 

6.6. 代理机制

Spring AOP部分使用JDK动态代理或者CGLIB来为目标对象创建代理。(建议尽量使用JDK的动态代理)

如果被代理的目标对象实现了至少一个接口,则会使用JDK动态代理。所有该目标类型实现的接口都将被代理。若该目标对象没有实现任何接口,则创建一个CGLIB代理。

如果你希望强制使用CGLIB代理,(例如:希望代理目标对象的所有方法,而不只是实现自接口的方法)那也可以。但是需要考虑以下问题:

  • 无法通知(advise)Final 方法,因为他们不能被覆写。

  • 你需要将CGLIB 2二进制发行包放在classpath下面,与之相较JDK本身就提供了动态代理

强制使用CGLIB代理需要将 <aop:config>proxy-target-class 属性设为true:

<aop:config proxy-target-class="true">

	...

</aop:config>

当需要使用CGLIB代理和@AspectJ自动代理支持,请按照如下的方式设置 <aop:aspectj-autoproxy>proxy-target-class 属性:

<aop:aspectj-autoproxy proxy-target-class="true"/>
0
0
分享到:
评论
2 楼 ssg108 2010-08-07  
以后也许会有的,呵呵
1 楼 fy616508150 2010-08-04  
MM弱弱问下```DWR JQUERY在本网站怎么没设专栏,怎么找资料

相关推荐

    spring事务配置的5中方式

    Spring 事务配置是Spring框架中不可或缺的一部分,它用于管理和协调应用程序中的事务边界,确保数据的一致性和完整性。在Spring中,事务配置主要涉及到三个核心组件:DataSource、TransactionManager和代理机制。...

    spring事务配置的五种方式

    ### Spring事务配置的五种方式详解 #### 一、引言 在企业级应用开发中,事务处理是非常重要的一部分,特别是在涉及多个数据库操作时。Spring框架提供了强大的事务管理功能,支持编程式和声明式两种事务处理方式。...

    Spring事务配置的五种方式

    Spring 事务配置是Spring框架中不可或缺的部分,它用于管理和协调应用程序中的事务边界,确保数据的一致性和完整性。在Spring中,事务配置主要涉及到三个核心组件:DataSource、TransactionManager以及代理机制。...

    Spring 事务配置

    Spring 事务配置SpringSpring 事务配置Spring 事务配置Spring 事务配置Spring 事务配置Spring 事务配置

    详细说明spring事务配置的5种方式

    本文将详细介绍Spring事务配置的五种方式,帮助你深入理解如何在Spring应用中管理事务。 1. **基于XML的声明式事务管理** 第一种方式是在每个Bean上使用代理来实现事务管理。首先,配置`DataSource`,通常是`...

    spring事务配置详解

    下面是五种Spring事务配置方式的详细说明: **第一种方式:基于代理的声明式事务管理** 在这个配置中,每个业务对象(如DAO)都有一个事务代理。`TransactionProxyFactoryBean`被用来创建这个代理,它需要指定事务...

    Spring 事务配置详解(多种配置方法)

    本文将详细解析Spring事务配置的多种方法,包括XML配置和注解方式。 首先,理解Spring事务配置的基本组件至关重要。这些组件主要包括: 1. **DataSource**:数据源,它是连接数据库的桥梁,负责管理与数据库的连接...

    Spring事务配置的五种方式.doc

    Spring事务配置的五种方式 Spring框架中事务配置是非常重要的一部分,通常由三个组成部分组成,即DataSource、TransactionManager和代理机制。无论采取何种配置方式,代理机制部分总是变化的,而DataSource和...

    解决osgi spring 事务配置问题

    本篇文章将详细探讨如何在OSGi环境下解决Spring事务配置问题。 首先,我们需要理解OSGi的核心概念。OSGi提供了一个运行时环境,允许开发者创建可热插拔的Java模块,称为 bundles。这些bundles可以通过服务注册和...

    Spring 事务配置解惑 - GitChat

    Spring 事务配置解惑.html 抓下来打包成了HTML文件, 方便离线观看

Global site tag (gtag.js) - Google Analytics