Как установить autocommit в false в спящем режиме с помощью Spring MVC

В настоящее время я изучаю интеграцию Spring + Hibernate, и пока я заставляю его работать. Но я столкнулся с ситуацией, когда я не хочу фиксировать транзакцию в конце процесса, потому что я просто хочу увидеть сгенерированный SQL-запрос для целей тестирования и отладки.

Я уже добавил false в свои свойства гибернации, но тогда это все еще не работает.

Можно ли этого добиться, если использовать Spring для обработки транзакций в спящем режиме? потому что при использовании традиционных транзакций в hibernate это возможно, просто не вызывайте метод session.commit(), и все обновления и вставки не будут сохранены;

в настоящее время у меня есть этот код для моего сервисного уровня:

@Transactional(распространение = Propagation.SUPPORTS, readOnly = true) открытый класс EmployeeServiceImpl {

@Autowired
private EmployeeDao employeeDao

@Transactional(propagation = Propagation.REQUIRED, readOnly = false)
public void saveEmployee(Employee employee){

    // count the number of employee in the database
    int n  = employeeDao.getEmployeeCount();
    // lets say it should print 10 here
    System.out.println("number of employee before inserting : " + n);

    // insert to employee
    employeeDao.saveEmployee(employee);

    // then count the employee after inserting
    n  =  employeeDao.getEmployeeCount();

    // then it should print 11 here after inserting new employee
    System.out.println("number of employee after inserting : " + n);

/* Then Dont commit insert!!!
*/

}

}

Код для слоя Дао:

public EmployeeDaoImpl implements EmployeeDao{

@Autowired
public void saveEmployee(Employee employee){

    sessionFactory.getCurrentSession.save(employee);

}

public int getEmployeeCount(){

    String count = sessionFactory.getCurrentSesion.createQuery("select count(emp.employeeId) from Employee emp")
    .list().get(0).toString;

return Integer.valueOf(count);
}

}

Но в данном случае происходит фиксация транзакции!, но я не хочу фиксировать транзакцию только для целей тестирования и отладки.

Я также пробовал @Transactional(распространение = Propagation.SUPPORTS, readOnly = false) вместо @Transactional(распространение = Propagation.SUPPORTS, readOnly = true)

Но что здесь происходит, так это то, что он не фиксирует транзакцию, однако количество сотрудников также не увеличивается.

Итак, я ожидаю, что произойдет здесь, что посчитать количество сотрудников, прежде чем вставить в таблицу сотрудников. Затем вставьте в таблицу сотрудников и снова посчитайте количество сотрудников, чтобы оно увеличилось на 1. Но в конце процесса я не хочу фиксировать эту вставку!

У вас есть идея, ребята?

Буду очень благодарен за любую помощь! Спасибо!

1 ответ

Решение

Для тестирования используйте Spring test framework. Он обрабатывает автоматические откаты транзакций для вас. Если вы ищете что-то еще, вам нужно быть более конкретным. Ваш вопрос, хотя и полный деталей, был довольно расплывчатым в отношении того, что вы на самом деле хотите сделать. Вы просто часто используете такие слова, как "тест" и "отладка". Эти слова могут означать много разных вещей для разных людей.

Другие вопросы по тегам