2016-11-03 5 views
1

У меня есть 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; 
      } 
     }); 
} 

ответ

-2

почему вы хотите транзакцию для одной вставки/сохранить действие. Если спасбросок не удается, то не будет сохранена, так что нет ничего, чтобы откатить

+0

Это должен быть комментарий – zero01alpha

1

Это не самый лучший дизайн, но если необходимо, вы можете попробовать с более конкретным исключением с пунктом throw и атрибут @TransactionalrollbackFor ,

Посмотрите на это post.