私は沢山のspring mvcコントローラを持つwebappを持っています。 これらのコントローラは、JPA、エンティティおよびリポジトリを使用してDBと対話します。コントローラで例外がスローされた場合、JPAロールバックトランザクションが発生する
コントローラメソッドがspring mvcによって処理されるとき、プロセス中に例外がスローされると、そのメソッドの間に追加されるすべてのDB変更がロールバックされることを確認したいと思います。ここでは例
:
<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 ");
}
}
私はグループがDBに追加されません期待して!
@Transactionalはそうするが、そうしないことを願っています。
私は
<tx:annotation-driven transaction-manager="transactionManager" />
が効果を追加しました。 これを簡単に行う方法はありますか?
それとも私たちがジーブスで行ったように私は、スーパートランザクション管理のようなものを持っている私のディスパッチャサーブレットをカプセル化することができます:あなたは、単一の挿入のための取引をしたいですか、なぜ
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