gpt4 book ai didi

hibernate - Spring事务不会异常回滚

转载 作者:行者123 更新时间:2023-12-02 00:51:02 24 4
gpt4 key购买 nike

配置.xml

<bean id="emfactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="persistenceUnitName" ref="default"/>
<property name="jpaVendorAdaptor">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdaptor"/>
</property>
<property name="jpaProperties">
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.dialect">com.xxx.xxx.xxx.xxx.SQLServer2012CustomDialect</prop>
</property>
</bean>

<tx:annotation-driven transaction-manager="txManager"/>
<bean id="txManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="emfactory"/>
</bean>

服务.java

@Transactional
public void save(Dto dto) throws Exception{
dao.save(entity);
throw new Exception();
}

我的问题是这个异常不回滚事务。我搜索了很多,发现默认情况下针对运行时/未检查异常的 spring 回滚事务。我试过如下;

@Transactional
public void save(Dto dto) throws Exception{
dao.save(entity);
throw new RunTimeException();
}

这工作正常,但它并不总是在代码中随处抛出运行时异常。所以,我确实挖掘并发现 rollbackFor 如下;

@Transactional(rollbackFor = Exception.class)
public void save(Dto dto) throws Exception{
dao.save(entity);
throw new Exception();
}

现在我必须更改我的所有代码以将@Transactional 更改为rollbackFor。但是还有其他方法可以将所有 @Transaction 建议属性更改为 rollbackFor = Exception.class 吗?

最佳答案

再看看图中的红色矩形:

enter image description here

使用@Transactional 默认是只回滚未检查的异常,检查的异常不会回滚默认

这可能会解决您的问题:(查看红色矩形)

enter image description here

你假设要传递一个类数组给这个属性,那么你应该这样写:

@Transactional(rollbackFor = new Class[]{Exception.class})

并且像你写的那样:

@Transactional(rollbackFor = Exception.class)

现在,如果您想在不指定 rollbackFor 属性 的情况下回滚已检查的异常,则必须将 XML 配置添加到您的配置文件中。像这样:

<tx:advice id="txAdvice">
<tx:attributes>
<tx:method name="*" rollback-for="Throwable"/>
</tx:attributes>
</tx:advice>

将此添加到您的配置 XML 文件中。以上将回滚已检查的异常。

关于hibernate - Spring事务不会异常回滚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39844705/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com