Ich habe diese Anmerkung erfolgreich für eine Dao-Klasse verwendet. Und Rollback funktioniert für Tests.
Aber jetzt muss ich echten Code zurücksetzen, nicht nur Tests. Es gibt spezielle Anmerkungen zur Verwendung in Tests. Aber welche Anmerkungen gelten für Nicht-Testcode? Das ist eine große Frage für mich. Dafür habe ich schon einen Tag verbracht. Die offizielle Dokumentation entsprach nicht meinen Bedürfnissen.
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 ist
@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);
}
}
Und hier ist ein Test, für den die Anmerkungen gut funktionieren:
@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>
...
** JA, ich habe die Transaktion zurückgesetzt. Ich habe gerade BEAN für den Service hinzugefügt ... und dann beginnt die Annotation @Transactional zu funktionieren :-) **
<bean id="service" class="main.MyClass">
<property name="employeeDao" ref="employeeDao" />
</bean>
Vielen Dank, Russland wird dich nicht vergessen!
@Transactional
Anmerkung enthalten. Andernfalls wird jeder DAO-Aufruf gestartet und eine neue Transaktion festgeschrieben, bevor Sie eine Ausnahme im Dienst auslösen. Die Quintessenz lautet: Die Ausnahme muss eine als@Transactional
.org.springframework.orm.hibernate3.HibernateTransactionManager
in Ihrem Spring-Kontext konfiguriert? Wenn Sie denorg.springframework.transaction
Logger aktivieren , zeigt er etwas Interessantes an?oder programmatisch
quelle
Sie können eine ungeprüfte Ausnahme von der Methode auslösen, die Sie zurücksetzen möchten. Dies wird bis zum Frühjahr erkannt und Ihre Transaktion wird nur als Rollback markiert.
Ich gehe davon aus, dass Sie Spring hier verwenden. Und ich gehe davon aus, dass die Anmerkungen, auf die Sie sich in Ihren Tests beziehen, auf Federtests basierende Anmerkungen sind.
und beachten Sie, dass:
quelle
Für mich war rollbackFor nicht genug, also musste ich das setzen und es funktioniert wie erwartet:
Ich hoffe, es hilft :-)
quelle
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
unter Ihnen geholfen