java – Annotation @Transactional。如何回滚?

我使用这个注释成功的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。

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

@Transactional(rollbackFor=Exception.class)

这将抛出任何异常后回滚事务。

http://stackoverflow.com/questions/7872773/annotation-transactional-how-to-rollback

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:java – Annotation @Transactional。如何回滚?