J'ai utilisé cette annotation avec succès pour une classe Dao. Et la restauration fonctionne pour les tests.
Mais maintenant, j'ai besoin de restaurer du vrai code, pas seulement des tests. Il existe des annotations spéciales à utiliser dans les tests. Mais quelles annotations sont pour le code non test? C'est une grande question pour moi. J'ai déjà passé une journée pour ça. La documentation officielle ne répondait pas à mes besoins.
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();
}
}
employéDao est
@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);
}
}
Et voici un test pour lequel les annotations fonctionnent bien:
@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>
...
** OUI, j'ai annulé la transaction. Je viens d'ajouter BEAN pour le service ... puis l'annotation @Transactional commence à fonctionner :-) **
<bean id="service" class="main.MyClass">
<property name="employeeDao" ref="employeeDao" />
</bean>
Merci à tous, la Russie ne vous oubliera pas!
@Transactional
annotation. Sinon, chaque appel DAO démarre et valide une nouvelle transaction avant de lever une exception dans le service. La ligne du bas est: l'exception doit laisser (échapper) une méthode marquée comme@Transactional
.org.springframework.orm.hibernate3.HibernateTransactionManager
configuré dans votre contexte Spring? Si vous activez l'org.springframework.transaction
enregistreur, cela montre-t-il quelque chose d'intéressant?ou par programme
la source
Vous pouvez lever une exception non vérifiée à partir de la méthode que vous souhaitez restaurer. Cela sera détecté au printemps et votre transaction sera marquée comme annulation uniquement.
Je suppose que vous utilisez Spring ici. Et je suppose que les annotations auxquelles vous faites référence dans vos tests sont les annotations basées sur les tests de ressorts.
et notez que:
la source
Pour moi, rollbackFor n'était pas suffisant, j'ai donc dû mettre ceci et cela fonctionne comme prévu:
J'espère que cela aide :-)
la source
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
ci-dessous vous avez aidé