Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 交易不存在';在Spring声明性事务模式下似乎无法工作_Java_Hibernate_Spring_Transactions_Declarative - Fatal编程技术网

Java 交易不存在';在Spring声明性事务模式下似乎无法工作

Java 交易不存在';在Spring声明性事务模式下似乎无法工作,java,hibernate,spring,transactions,declarative,Java,Hibernate,Spring,Transactions,Declarative,我试图在Spring+Struts+Hibernate设置中实现声明性事务管理。 这是我的applicationcontext.xml的一部分 <property> <props> <prop key="foodoo*">PROPAGATION_REQUIRED,-FooException</prop> </props> </property> (foodooTest应触发事务) 我创建了bean FooS

我试图在Spring+Struts+Hibernate设置中实现声明性事务管理。 这是我的applicationcontext.xml的一部分

<property>
  <props>
    <prop key="foodoo*">PROPAGATION_REQUIRED,-FooException</prop>
  </props>
</property>
(foodooTest应触发事务) 我创建了bean

FooService fooService = (FooService)context.getBean("fooService");
//and call
fooService.UpdateFoo();
Test2抛出FooException,因此我希望事务回滚。但事实并非如此。提交发生在每个Test1和Test2中(直到异常)。 我使用Hibernate getHibernateTemplate.Merge()进行更新。我的数据库引擎是InnoDB


我不确定这里缺少了什么。

只有当自定义异常扩展了
RuntimeException
时,Spring才会回滚异常事务。确保
footexception
扩展
RuntimeException
():

在默认配置中,Spring框架的事务基础结构代码仅在运行时未检查的异常情况下标记要回滚的事务;也就是说,当抛出的异常是RuntimeException的实例或子类时。(默认情况下,错误也会导致回滚)。从事务方法引发的已检查异常不会导致默认配置中的回滚

根据您的评论,这里还有两件事需要检查:1)确保已配置平台事务管理器。例如:

<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="mySessionFactory" />
</bean>

此外,如果要对事务使用注释,还需要对其进行配置:

<tx:annotation-driven />

仅当自定义异常扩展了运行时异常时,Spring才会回滚异常事务。确保
footexception
扩展
RuntimeException
():

在默认配置中,Spring框架的事务基础结构代码仅在运行时未检查的异常情况下标记要回滚的事务;也就是说,当抛出的异常是RuntimeException的实例或子类时。(默认情况下,错误也会导致回滚)。从事务方法引发的已检查异常不会导致默认配置中的回滚

根据您的评论,这里还有两件事需要检查:1)确保已配置平台事务管理器。例如:

<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
    <property name="sessionFactory" ref="mySessionFactory" />
</bean>

此外,如果要对事务使用注释,还需要对其进行配置:

<tx:annotation-driven />


您应该发布更相关的suff:spring配置和触发事务的方法。您应该发布更相关的suff:spring配置和触发事务的方法。好的,我的问题不是真正的回滚(我认为这是可控的)。我的问题是,提交发生在Test1和Test2中(我可以在DB中看到),甚至在我继续抛出FooException之前。此外,如果我将“updatefo”添加到应用程序配置中,事务将按预期工作。(在这两种情况下,我都会通过struts操作调用UpdateFoo。这意味着你用于测试的Spring配置与你的应用程序的Spring配置不匹配。请尽可能使这两个配置匹配。你能详细说明一下吗?我正在处理我的本地框,并对此进行更新和测试。我的concern->如果我添加服务调用方法(我从Struts操作类调用该方法)对于定义事务规则的配置,事务似乎可以按预期工作。但是,如果不向该配置添加服务调用,而是向配置添加代理方法Foo,并从服务调用方法调用Foo,则事务似乎无法工作。我的意思是:如果您在Spring应用程序的配置之外运行测试(例如,使用
SpringJUnit4ClassRunner
),这可能会导致不同的行为。如果您正在更改应用程序中调用方法的方式,则情况会有所不同。请更新您的问题,以反映您试图调试的完整配置。好的,我的问题不是真正的回滚(我认为这是可控的)。我的问题是,提交发生在Test1和Test2中(我可以在DB中看到),甚至在我继续抛出FooException之前。是的,它已配置。此外,如果我将“UpdateFoo”添加到应用程序配置中,事务将按预期工作。(在这两种情况下,我都会通过struts操作调用UpdateFoo。这意味着你用于测试的Spring配置与你的应用程序的Spring配置不匹配。请尽可能使这两个配置匹配。你能详细说明一下吗?我正在处理我的本地框,并对此进行更新和测试。我的concern->如果我添加服务调用方法(我从Struts操作类调用该方法)对于定义事务规则的配置,事务似乎可以按预期工作。但是,如果不向该配置添加服务调用,而是向配置添加代理方法Foo,并从服务调用方法调用Foo,则事务似乎无法工作。我的意思是:如果您在Spring应用程序的配置之外运行测试(例如,使用
SpringJUnit4ClassRunner
),这可能会导致不同的行为。如果您正在更改应用程序中调用方法的方式,则情况会有所不同。请更新您的问题以反映您尝试调试的完整配置。