Z powodzeniem użyłem tej adnotacji na zajęciach Dao. Przywracanie działa również w przypadku testów.
Ale teraz potrzebuję przywrócić rzeczywisty kod, a nie tylko testy. Istnieją specjalne adnotacje do wykorzystania w testach. Ale które adnotacje dotyczą kodu niebędącego testem? To dla mnie duże pytanie. Spędziłem już na to dzień. Oficjalna dokumentacja nie spełniała moich potrzeb.
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();
}
}
Pracownik jest
@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);
}
}
A oto test, w przypadku którego adnotacje działają dobrze:
@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));
}
HibernateBIZBeans.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>
...
** TAK, wycofałem transakcję. Właśnie dodałem BEAN do usługi ... a potem adnotacja @Transactional zaczyna działać :-) **
<bean id="service" class="main.MyClass">
<property name="employeeDao" ref="employeeDao" />
</bean>
Dzięki wszystkim, Rosja cię nie zapomni!
@Transactional
adnotację. W przeciwnym razie każde wywołanie DAO rozpoczyna się i zatwierdza nową transakcję, zanim zgłosi wyjątek w usłudze. Najważniejsze jest to: wyjątek musi opuścić (uciec) metodę oznaczoną jako@Transactional
.org.springframework.orm.hibernate3.HibernateTransactionManager
skonfigurowałeś w kontekście Spring? Jeśli włączyszorg.springframework.transaction
rejestrator, czy pokazuje on coś interesującego?lub programowo
źródło
Możesz zgłosić niezaznaczony wyjątek od metody, którą chcesz wycofać. Zostanie to wykryte do wiosny, a Twoja transakcja zostanie oznaczona jako tylko wycofanie.
Zakładam, że używasz tutaj Spring. Zakładam, że adnotacje, do których odwołujesz się w swoich testach, są adnotacjami opartymi na teście sprężynowym.
i zauważ, że:
źródło
Dla mnie rollbackFor to za mało, więc musiałem to włożyć i działa zgodnie z oczekiwaniami:
@Transactional(propagation = Propagation.REQUIRED, readOnly = false, rollbackFor = Exception.class)
Mam nadzieję, że to pomoże :-)
źródło
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
poniżej pomogłeś