我的资源方法是批量创建用户。 我使用@UnitOfWork注释我的资源方法,但是我对此操作的特定服务方法也进行了注释,因为只有部分用户被保存的情况对我来说很有用。
总结我有主要交易,并且需要多次嵌套交易来单独保存用户。
我注意到当我的资源方法未使用@UnitOfWork注释并且我的服务BulkSave方法是注释时,dropwizard无法开始事务处理。从逻辑的角度来看,这应该有效但不起作用。
我尝试使用@UnitOfWork设置刷新模式,首先我将FlushMode设置为Manual,这几乎是完美的。当嵌套事务回滚时,主事务可以提交,这是很好的解决方案。 但是这个解决方案并没有我想象的那么好。使用级联保存相关实体不会工作!
最后,当嵌套事务回滚时,我没有保存相关实体或主事务中的错误(在发生异常后不刷新会话)
任何人都有类似的情况或者对Dropwizard中的会话管理有更多了解吗?
答案 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);
}