Я использую Spring + Hibernate + H2. Я выполняю операции с базой данных в своих интеграционных тестах (вызывая класс обслуживания). Я хочу, чтобы Spring откатывал изменения после каждого метода тестирования, но я не могу заставить его работать. Сначала я использовал MySQL (с MyISAM, который не поддерживает транзакции), но после перехода на H2 проблема осталась. Я пробовал несколько определений DataSource (после прочтения, что он должен быть осведомлен о XA), но ничего не помогает.
Я использую http://code.google.com / p / generic-dao / для моих классов DAO и аннотаций @ Transactional на моем уровне обслуживания (если я их удалю, я получаю следующую ошибку: javax.persistence.TransactionRequiredException: транзакция не выполняется).
Мои тестовые классы выглядят так:
@ContextConfiguration("classpath:...spring.xml")
@Transactional
@TransactionConfiguration(transactionManager="transactionManager", defaultRollback=true)
public class DemoServiceTest extends AbstractTestNGSpringContextTests{
@Autowired
private DemoService demoService;
@Test
public void addTest()
{
int size = demoService.findAll().size();
Test coach = new Test();
test.setName("Test");
testService.save(test);
Assert.assertEquals(size+1,testService.findAll().size());
}
}
Вот моя весенняя конфигурация:
И это моя реализация службы:
@Transactional
public class TestServiceImpl implements TestService {
private TestDAO dao;
@Autowired
public void setDao(TestDAO dao) {
this.dao = dao;
}
public void save(Test test) {
dao.persist(test);
dao.flush();
}
public List findAll() {
return dao.findAll();
}
public Test findByName(String name) {
if (name == null)
return null;
return dao.searchUnique(new Search().addFilterEqual("name", name));
}
}
РЕДАКТИРОВАТЬ: Метод dao.persist () в основном инкапсулирует вызов следующего метода из genericdao (em возвращает текущий EntityManager):
/**
*
* Make a transient instance persistent and add it to the datastore. This
* operation cascades to associated instances if the association is mapped
* with cascade="persist". Throws an error if the entity already exists.
*
*
* Does not guarantee that the object will be assigned an identifier
* immediately. With persist
a datastore-generated id may not
* be pulled until flush time.
*/
protected void _persist(Object... entities) {
for (Object entity : entities) {
if (entity != null)
em().persist(entity);
}
}
Все работает нормально, но изменения остаются в базе данных. Есть идеи?