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 load
DEBUG 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链接被关闭,而第二个操作,根本不打开连接和事务,请问大侠们,问题在哪里?
------------------------------------------------------------------------------------------------------------------
问题补充:
谢谢你的关注,我下去试一试,成功马上给分。
------------------------------------------------------------------------------------------------------------------
问题补充:
你的回答,一语中的,非常感谢。
我按照你的指导,按如下步骤调整了bean生成的配置:
1、实体和服务层和common层的bean,由ApplicationContext负责扫描;
2、控制器,分别由前台、后台的servlet负责扫描;
测试成功!
感谢之情,无以言表。
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 load
DEBUG 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链接被关闭,而第二个操作,根本不打开连接和事务,请问大侠们,问题在哪里?
------------------------------------------------------------------------------------------------------------------
问题补充:
谢谢你的关注,我下去试一试,成功马上给分。
------------------------------------------------------------------------------------------------------------------
问题补充:
你的回答,一语中的,非常感谢。
我按照你的指导,按如下步骤调整了bean生成的配置:
1、实体和服务层和common层的bean,由ApplicationContext负责扫描;
2、控制器,分别由前台、后台的servlet负责扫描;
测试成功!
感谢之情,无以言表。
采纳的答案
2011-04-25 Copperfield (中级程序员)
看不到你的配置文件,不知道是否和我以前遇到的问题类似:
在主容器中(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中的扫描配置进行事务处理。
在主容器中(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中的扫描配置进行事务处理。