gpt4 book ai didi

java - 注释@Transactional。如何回滚?

转载 作者:IT老高 更新时间:2023-10-28 11:51:30 26 4
gpt4 key购买 nike

我成功地将这个注解用于一个 Dao 类。回滚适用于测试。

但现在我需要回滚真实代码,而不仅仅是测试。有用于测试的特殊注释。但是哪些注解是针对非测试代码的呢?对我来说这是一个很大的问题。我已经为此花了一天时间。官方文档不符合我的需求。

class MyClass { // this does not make rollback! And record appears in DB.
EmployeeDaoInterface employeeDao;

public MyClass() {
ApplicationContext context = new ClassPathXmlApplicationContext(
new String[] { "HibernateDaoBeans.xml" });
employeeDao = (IEmployeeDao) context.getBean("employeeDao");
}

@Transactional(rollbackFor={Exception.class})
public void doInsert( Employee newEmp ) throws Exception {
employeeDao.insertEmployee(newEmp);
throw new RuntimeException();
}
}

employeeDao 是

@Transactional
public class EmployeeDao implements IEmployeeDao {
private SessionFactory sessionFactory;

public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}

public void insertEmployee(Employee emp) {
sessionFactory.getCurrentSession().save(emp);
}
}

这是一个注释工作良好的测试:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "/HibernateDaoBeans.xml" })
@TransactionConfiguration(transactionManager = "txManager", defaultRollback = true)
@Transactional
public class EmployeeDaoTest {

@Autowired
EmployeeDaoInterface empDao;

@Test
public void insert_record() {
...
assertTrue(empDao.insertEmployee(newEmp));
}

HibernateDaoBeans.xml

   ...
<bean id="employeeDao" class="Hibernate.EmployeeDao">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<tx:annotation-driven transaction-manager="txManager"/>

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



**是的,我回滚了交易。我刚刚为服务添加了 BEAN...然后注释 @Transactional 开始工作:-) **

<bean id="service" class="main.MyClass">
<property name="employeeDao" ref="employeeDao" />
</bean>

谢谢大家,俄罗斯不会忘记你们的!

最佳答案

只需从标记为 @Transactional 的方法中抛出任何 RuntimeException

默认情况下,所有 RuntimeException 的回滚事务,而检查的异常则不会。这是 EJB 的遗产。您可以使用 rollbackFor()noRollbackFor() 注释参数进行配置:

@Transactional(rollbackFor=Exception.class)

这将在抛出 any 异常后回滚事务。

关于java - 注释@Transactional。如何回滚?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7872773/

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