Я успешно использовал эту аннотацию для класса Дао. И откат для тестов работает.
Но теперь мне нужно откатывать реальный код, а не только тесты. Есть специальные аннотации для использования в тестах. Но какие аннотации предназначены для нетестового кода? Для меня это большой вопрос. Я потратил на это уже день. Официальная документация мне не подошла.
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();
}
}
сотрудникДао
@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>
...
** ДА, я откатил транзакцию. Я только что добавил БИН для сервиса ... и тут начинает работать аннотация @Transactional :-) **
<bean id="service" class="main.MyClass">
<property name="employeeDao" ref="employeeDao" />
</bean>
Всем спасибо, Россия вас не забудет!
@Transactional
аннотацию. В противном случае каждый вызов DAO запускается и фиксирует новую транзакцию до того, как вы создадите исключение в службе. Суть в следующем: исключение должно покинуть метод, помеченный как@Transactional
.org.springframework.orm.hibernate3.HibernateTransactionManager
настроили в своем контексте Spring? Если включитьorg.springframework.transaction
логгер, он ничего интересного не показывает?или программно
источник
Вы можете выбросить непроверенное исключение из метода, который хотите откатить. Это будет обнаружено весной, и ваша транзакция будет отмечена только как откат.
Я предполагаю, что вы здесь используете Spring. И я предполагаю, что аннотации, на которые вы ссылаетесь в своих тестах, являются аннотациями на основе весенних тестов.
и обратите внимание, что:
источник
Для меня rollbackFor было недостаточно, поэтому мне пришлось поставить это, и он работает, как ожидалось:
@Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = Exception.class)
Я надеюсь, что это помогает :-)
источник
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
ниже вы помогли