У меня есть webapp с тоннами весенних контроллеров mvc. Эти контроллеры взаимодействуют с БД с JPA, сущностями и репозиториями.Весна JPA Откат транзакции, если Исключение бросили в контроллер
Я хотел бы быть уверенным, что когда метод контроллера обрабатывается весной mvc, все изменения БД, которые добавляются во время этого метода, являются откатами, если во время процесса генерируется какое-либо исключение.
Вот пример:
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>
Контроллер
@Controller
public class JpaTest {
@Autowired
GroupRepository groupRepository;
@RequestMapping(value = "/{langId}/jpatest", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
@Transactional
public String test() throws Exception {
Group group = new Group();
group.setName("jpaTest");
groupRepository.save(group);
throw new Exception("MY EXCEPTION ");
}
}
Я ожидаю, что группа не будет добавлен в БД!
Надеюсь, что @Transactional сделает это, но нет.
Я добавил
<tx:annotation-driven transaction-manager="transactionManager" />
Но никакого эффекта. Есть ли способ сделать это просто?
Или я мог инкапсулировать мой диспетчеру Servlet иметь вид супер управления транзакциями, как мы это делали с Jeeves:
protected void doDispatch(final HttpServletRequest request, final HttpServletResponse response) throws Exception {
JeevesDispatcherServlet.super.doDispatch(request, response);
TransactionManager.runInTransaction("jeevesDispatchServlet", getWebApplicationContext(),
TransactionManager.TransactionRequirement.CREATE_ONLY_WHEN_NEEDED,
TransactionManager.CommitBehavior.ONLY_COMMIT_NEWLY_CREATED_TRANSACTIONS,
false, new TransactionTask<Void>() {
@Override
public Void doInTransaction(TransactionStatus transaction) throws Throwable {
JeevesDispatcherServlet.super.doDispatch(request, response);
return null;
}
});
}
Это должен быть комментарий – zero01alpha