Dropwizard嵌套事务

时间:2014-10-16 18:54:15

标签: java hibernate transactions dropwizard

我的资源方法是批量创建用户。 我使用@UnitOfWork注释我的资源方法,但是我对此操作的特定服务方法也进行了注释,因为只有部分用户被保存的情况对我来说很有用。

总结我有主要交易,并且需要多次嵌套交易来单独保存用户。

我注意到当我的资源方法未使用@UnitOfWork注释并且我的服务BulkSave方法是注释时,dropwizard无法开始事务处理。从逻辑的角度来看,这应该有效但不起作用。

我尝试使用@UnitOfWork设置刷新模式,首先我将FlushMode设置为Manual,这几乎是完美的。当嵌套事务回滚时,主事务可以提交,这是很好的解决方案。 但是这个解决方案并没有我想象的那么好。使用级联保存相关实体不会工作!

最后,当嵌套事务回滚时,我没有保存相关实体或主事务中的错误(在发生异常后不刷新会话)

任何人都有类似的情况或者对Dropwizard中的会话管理有更多了解吗?

1 个答案:

答案 0 :(得分:2)

@UnitOfWork仅在资源方法中注册。因此,注释您的服务方法是行不通的。

而是在资源方法集中:

@UnitOfWork(transactional = false)

因此整个方法不会包含在单个事务中,但仍然可以从Session获得休眠UnitOfWork。然后在您的DAO方法中,通过以下方式手动控制事务:

   Transaction transaction = currentSession().beginTransaction();
   try {
       // do some transactions
       transaction.commit();
   } catch (Exception e) {
       transaction.rollback();
       throw new RuntimeException(e);
   }