【发布时间】:2015-05-02 23:47:52
【问题描述】:
我有一种方法可以将项目添加到表格并测试异常 我的项目存储在表中。引发异常,但未引发事务 回滚 我的方法
@Transactional(propagation = Propagation.REQUIRED, readOnly = false,
rollbackFor={java.lang.Exception.class, java.lang.RuntimeException.class})
public MyBean addItem(MyBean bean, Integer iduser) throws Exception {
NalogBean nb = txTemplate.execute(new TransactionCallback<MyBean>() {
@Override
public MyBean doInTransaction(TransactionStatus txStatus) {
MyBean nbl = null;
try {
sessionFactory.getCurrentSession().saveOrUpdate(bean);
throw new RuntimeException("Exception throwed!");
} catch (Exception e) {
txStatus.setRollbackOnly();
}
return nbl;
}
});
return nb;
}
我的 servlet-context 是标准的
<tx:annotation-driven transaction-manager="transactionManager"/>
<beans:bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<beans:property name="driverClassName" value="${database.driver}" />
<beans:property name="url" value="${database.url}" />
<beans:property name="username" value="${database.user}" />
<beans:property name="password" value="${database.password}" />
</beans:bean>
<beans:bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<beans:property name="dataSource" ref="dataSource"></beans:property>
<beans:property name="hibernateProperties">
<beans:props>
<beans:prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</beans:prop>
</beans:props>
</beans:property>
<beans:property name="packagesToScan" value="rs.co"></beans:property>
<beans:property name="annotatedClasses">
<beans:list>
<beans:value>rs.co.mfp.klijent.finansije.model.NalogModel</beans:value>
</beans:list>
</beans:property>
</beans:bean>
<beans:bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<beans:property name="sessionFactory" ref="sessionFactory"/>
</beans:bean>
当我调用 addItem 时,它将 bean 存储到表中。 我也尝试不使用 txTemplate,只是 sessionFactory.getCurrentSession().saveOrUpdate(bean); throw new RuntimeException("抛出异常!"); 但同样的结果。项目被存储到表中。 有什么想法吗?
【问题讨论】:
-
你可以去掉rollbackFor块中的RuntimeException,因为它继承了Exception。此外,您重复 readOnly 和传播的默认值。
-
mh-dev,是的,它是双重的,但我尝试了一切。我也尝试@Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor={java.lang.Exception.class, java.lang.RuntimeException.class}) public NalogBean addNalog(NalogBean bean, Integer iduser) throws Exception { NalogModel模型=空;模型 = 转换模型(豆); sessionFactory.getCurrentSession().saveOrUpdate(model); bean.setIdnalog(model.getIdnalog()); if (true) throw new RuntimeException("抛出异常!"); //testRequired();回豆; },但它将数据写入表中
-
说实话,你所做的与我现在使用spring的方式相去甚远。整个 xml 配置自动执行 Spring Boot。 (在属性文件中的数据源配置旁边)。一个重要的问题:您是否从同一个类中调用此方法?如果是,则注释在没有 aop 的情况下没有任何效果。
-
不,我从 springMvc 项目中调用它,控制器。这是来自测试项目的链接mfp.co.rs/wp-content/uploads/2015/05/testHibernate.zip
-
您使用的是 MySQL,然后确保您使用的是支持事务的表(InnoDB 类型而不是 MyISAM 类型)。
标签: spring spring-mvc transactional