今天,将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章 代理部分的内容:
Spring AOP部分使用JDK动态代理或者CGLIB来为目标对象创建代理。(建议尽量使用JDK的动态代理)
如果被代理的目标对象实现了至少一个接口,则会使用JDK动态代理。所有该目标类型实现的接口都将被代理。若该目标对象没有实现任何接口,则创建一个CGLIB代理。
如果你希望强制使用CGLIB代理,(例如:希望代理目标对象的所有方法,而不只是实现自接口的方法)那也可以。但是需要考虑以下问题:
强制使用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"/>
分享到:
相关推荐
Spring 事务配置是Spring框架中不可或缺的一部分,它用于管理和协调应用程序中的事务边界,确保数据的一致性和完整性。在Spring中,事务配置主要涉及到三个核心组件:DataSource、TransactionManager和代理机制。...
### Spring事务配置的五种方式详解 #### 一、引言 在企业级应用开发中,事务处理是非常重要的一部分,特别是在涉及多个数据库操作时。Spring框架提供了强大的事务管理功能,支持编程式和声明式两种事务处理方式。...
Spring 事务配置是Spring框架中不可或缺的部分,它用于管理和协调应用程序中的事务边界,确保数据的一致性和完整性。在Spring中,事务配置主要涉及到三个核心组件:DataSource、TransactionManager以及代理机制。...
Spring 事务配置SpringSpring 事务配置Spring 事务配置Spring 事务配置Spring 事务配置Spring 事务配置
本文将详细介绍Spring事务配置的五种方式,帮助你深入理解如何在Spring应用中管理事务。 1. **基于XML的声明式事务管理** 第一种方式是在每个Bean上使用代理来实现事务管理。首先,配置`DataSource`,通常是`...
下面是五种Spring事务配置方式的详细说明: **第一种方式:基于代理的声明式事务管理** 在这个配置中,每个业务对象(如DAO)都有一个事务代理。`TransactionProxyFactoryBean`被用来创建这个代理,它需要指定事务...
本文将详细解析Spring事务配置的多种方法,包括XML配置和注解方式。 首先,理解Spring事务配置的基本组件至关重要。这些组件主要包括: 1. **DataSource**:数据源,它是连接数据库的桥梁,负责管理与数据库的连接...
Spring事务配置的五种方式 Spring框架中事务配置是非常重要的一部分,通常由三个组成部分组成,即DataSource、TransactionManager和代理机制。无论采取何种配置方式,代理机制部分总是变化的,而DataSource和...
本篇文章将详细探讨如何在OSGi环境下解决Spring事务配置问题。 首先,我们需要理解OSGi的核心概念。OSGi提供了一个运行时环境,允许开发者创建可热插拔的Java模块,称为 bundles。这些bundles可以通过服务注册和...
Spring 事务配置解惑.html 抓下来打包成了HTML文件, 方便离线观看