请教:SpringMVC JPA 事务,单元测试通过,控制器不开启事务,如何解决

问题描述

我的项目情况如下: 1、使用Springmvc 3.0.5 Hibernate3.5.6 JPA,配置persistence.xml使用mysql; 2、使用Dao、Daosupport,Service、ServiceBean,web.xml中,使用OpenEntityManagerInViewFilter; 3、在使用Junit4做单元测试时,保存数据可以通过,但是控制器中,无法保存数据,错误如下:--控制器中先执行了一次查询操作,这是操作完成的提示:DEBUG org.hibernate.loader.Loader:(Loader.java:1966) - done entity loadDEBUG org.hibernate.jdbc.ConnectionManager:(ConnectionManager.java:427) - aggressively releasing JDBC connection--然后执行另一个保存操作:save--service.save--serviceBean.save--dao.save(entity),出现如下提示:DEBUG org.hibernate.event.def.AbstractSaveEventListener:(AbstractSaveEventListener.java:327) - delaying identity-insert due to no transaction in progress--问题就在这里,我对第二个操作,前后loger,发现第一个操作完成后,jdbc链接被关闭,而第二个操作,根本不打开连接和事务,请问大侠们,问题在哪里? 问题补充:谢谢你的关注,我下去试一试,成功马上给分。

解决方案

看不到你的配置文件,不知道是否和我以前遇到的问题类似:在主容器中(applicationContext.xml),将Controller的注解排除掉<context:component-scan base-package="com"> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" /></context:component-scan>而在springMVC配置文件中将Service注解给去掉<context:component-scan base-package="com"> <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller" /> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service" /> </context:component-scan>因为spring的context是父子容器,所以会产生冲突,Controller会先进行扫描装配,而此时的Service还没有进行事务的增强处理,得到的将是原样的Service(没有经过事务加强处理,故而没有事务处理能力) ,最后才是applicationContext.xml中的扫描配置进行事务处理。

时间: 2024-09-09 01:44:17

请教:SpringMVC JPA 事务,单元测试通过,控制器不开启事务,如何解决的相关文章

SpringMVC与Mybatis集合实现调用存储过程、事务控制实例_java

在SSM框架中经常会用到调用数据库中的存储过程.以及事务控制,下面以保存某单据为例,介绍一下: 1.Oracle中存储过程代码如下(主要逻辑将单据编码自动加1,并将该单据编码返回): CREATE OR REPLACE PROCEDURE "UPDATE_DJBHZT" (p_GSID in varchar2, p_TBLNAME in varchar2, NewRecNo out Number) as begin update BHDJ set BHDJ02 = BHDJ02+1 w

spring如何开启事务啊

问题描述 我请教大家一个问题, 最近需要用JAVA搭建一个平台.用ssh框架.好久没有弄,忘了有点.我想问下,spring是如何开启事务的了啊?是默认就开启的,还是需要什么配置啊? 解决方案 http://zywang.iteye.com/blog/974331http://zhou137520.iteye.com/blog/1675199解决方案二:基于aop事务处理的http://blog.csdn.net/irelandken/article/details/7194046

Spring声明式事务管理源码解读之事务提交

在下面的文章中,我讲会多次提到第一篇文章,第一篇文章是:Spring声明式事务管 理源码解读之事务开始 如果要理解事务提交的话,理解事务开始是一个前提条件,所以请先看第一篇文章,再 来看这篇 如果你仔细看下去,我想肯定是有很多收获,因为我们确实能从spring的代码和思想 中学到很多东西. 正文: 其实俺的感觉就是事务提交要比事务开始复杂,看事务是否提交我们还是要回到 TransactionInterceptor类的invoke方法 Java代码 public Object invoke(Met

Spring声明式事务管理源码解读之事务开始

这个是我昨天在解决问题是看源码得一点体验,可能说得比较大概,希望大家多多讨 论,把本贴得质量提高上去,因为spring实现的事务管理这部分我相信还是有点复杂的. 一个人未必能想得十分清楚 在spring的声明式事务管理中,它是如何判定一个及标记一个方法是否应该是处在事 务体之中呢. 首先要理解的是spring是如何来标记一个方法是否应该处在事务体之中的.有这样一 个接口TransactionDefinition,其中定义了很多常量,它还有一个子接口 TransactionAttribute,其中

事务使用中如何避免误用分布式事务(System.Transactions.TransactionScope)

1:本地事务DbTransaction和分布式事务TransactionScope的区别: 1.1:System.Data.Common.DbTransaction: 本地事务:这个没什么好说了,就是单个事务,每种数据库都有自己的实现,事务的深度内涵可以搜索查看相关的文章,不是本文介绍的重点. 1.2:System.Transactions.TransactionScope: 分布式事务,需要添加引用System.Transactions,同时启用MSDTC分布式事务服务:通常使用方式为:  u

Spring五个事务隔离级别和七个事务传播行为

Spring五个事务隔离级别和七个事务传播行为 1. 脏读 :脏读就是指当一个事务正在访问数据,并且对数据进行了修改,而这种修改还没有提交到数据库中,这时,另外一个事务也访问这个数据,然后使用了这个数据. 2. 不可重复读 :是指在一个事务内,多次读同一数据.在这个事务还没有结束时,另外一个事务也访问该同一数据.那么,在第一个事务中的两 次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的.这样就发生了在一个事务内两次读到的数据是不一样的,因此称为是不 可重复读.例如

spring声明式事务 同一类内方法调用事务失效

只要避开Spring目前的AOP实现上的限制,要么都声明要事务,要么分开成两个类,要么直接在方法里使用编程式事务 [问题]        Spring的声明式事务,我想就不用多介绍了吧,一句话"自从用了Spring AOP啊,事务管理真轻松啊,真轻松:事务管理代码没有了,脑不酸了,手不痛了,一口气全配上了事务:轻量级,测试起来也简单,嘿!".不管从哪个角度看,轻量级声明式事务都是一件解放生产力的大好事.所以,我们"一直用它".         不过,最近的一个项目里

web xml-安全问题解决,springMVC+linux+oracle搭建项目,报开启不安全http方法

问题描述 安全问题解决,springMVC+linux+oracle搭建项目,报开启不安全http方法 fortune/*PUTDELETEHEADOPTIONSTRACE 解决方案 fortune/*PUTDELETEHEADOPTIONSTRACE BASIC 解决方案二: <security-constraint> <web-resource-collection> <web-resource-name>fortune</web-resource-name&

spring mybatis配置了事务,存储过程也配置了事务

问题描述 spring mybatis配置了事务,存储过程也配置了事务 spring mybatis配置了事务,存储过程也配置了事务,如果存储过程事务回滚了,spring配置的事务会回滚吗? 解决方案 mybatis spring事务配置MyBatis Spring 注解事务配置spring整合mybatis之事务配置 解决方案二: 那得看具体的情况了,存储过程回滚的原因是? 解决方案三: 存储过程事务一般在数据库中自己设置,spring的事务控制service层等,两都一般分开,不会相互影响