Мы используем MyBatis (3.0.5) в качестве нашего инструмента для сопоставления (или у меня нет никаких прав для этого!).Откат Запросы ORMapper
Я создал объект Response
, который через MyBatis сопоставлен с нашей таблицей базы данных [responses]
(мы используем PostgreSQL).
На самом деле, структура ormapping мы используем следующим образом:
- ResponseMapper.xml - это файл XML, где PSQL запросы определены и сопоставлены с ResponseMapper.java ** класса и его методы
- ReponseMapper.java - интерфейс, используемый MyBatis для выполнения запросов, определенных в файле XML (выше)
- ResponseDAO.java - интерфейс, используемый для DI (используется пружина)
- ResponseDAOImpl.java - конкретная реализация
ResponseDAO
, которая фактически называетResponseMapper
методами; мы используем Spring впрыснуть экземпляры этого класса в наше приложение
Таким образом, чтобы вставить новую [responses]
записи в PostgreSQL, код выглядит следующим образом из компонента вызывающего:
@Autowired
private ResponseDAO response;
public void doStuff()
{
int action = getAction();
response.setAction(action);
response.insert();
}
Это наладочные работы красиво для нас. Однако теперь я пытаюсь написать набор тестов JUnit для класса ResponseDAOImpl
, и я хочу убедиться, что он правильно выполняет запросы к нашей базе данных PostgreSQL.
Насколько я могу судить, не существует способа «издеваться» над всей базой данных. Поэтому мой единственный вариант (по-видимому) заключается в том, чтобы тестовый метод (ы) выполнял запрос, проверял на успех, а затем откатывал его независимо.
MyBatis, похоже, не поддерживает эту функцию отката. Я нашел this опубликовать список рассылки mybatis-user
на Old Nabble, но плакат использовал Guice, и его вопрос, похоже, был больше связан с откатом транзакций через Guice.
Если MyBatis не поддержки сделки/откаты (делает это?!?!), то кажется, что мой единственный repireve бы, если драйвер PostgreSQL-JDBC поддерживает их. Думаю, я мог бы попытаться настроить мои методы тестирования, чтобы они запускали метод ResponseDAO.insert()
, а затем вручную попытались отменить транзакцию непосредственно через драйвер (sans MyBatis).
Есть ли у этого опыт? Образцы кода? Советы? Лучшие практики? Заранее спасибо!
Энди, не могли бы вы посмотреть на ответ Ремиза Б и мой комментарий? Не будет ли это решение работать? Что, если мой тестовый метод впервые получил SqlSession из SqlSessionFactoryBean и setAutoCommit (false), получил Savepoint, выполнил запрос и затем выполнил возврат к Savepoint? Весна все еще отменяет это поведение?!? – IAmYourFaja
Вы вводите карты? Если так, я думаю, Spring все равно откроет новый SqlSession для вызовов картографа. Я действительно больше знаком с материалами Guice, но документы [1] заставляют меня думать, что mapper запускает собственный сеанс sql. http://code.google.com/p/mybatis/downloads/detail?name=mybatis-spring-1.0.2-reference.pdf – Andy