我们如何使用jdbi强制Dropwizard中的资源(控制器)级别事务?

Pre*_*thi 6 java dao transactions jdbi dropwizard

在spring中,我们有@Transactional一个可以在Controller中指定的注释,因此在控制器方法中发生的所有事情都被视为一个事务.但是在dropwizard中,我们可以通过实现在DAO级别进行事务处理Transactional<DAOclass>.但是,如果我在单个资源方法中使用两个DAO,则将其视为两个不同的事务.

说我有两个DAO

Dao1.java

   public abstract class Dao1 implements Transactional<Dao1>{
    @sqlQuery(//somequery)
    public abstract void insertIntoArticles();
   }
Run Code Online (Sandbox Code Playgroud)

Dao2.java

   public abstract class Dao2 implements Transactional<Dao2>{
    @sqlQuery(//somequery)
    public abstract void insertIntoArticlesChildren();
   }
Run Code Online (Sandbox Code Playgroud)

ArticleResource.java

    @POST
    @PATH("/articles")
    public void insertArticleAndItsChildren(Integer articleId){
     try{
       dao1.begin();
       dao2.begin();
       dao1.insertIntoArticles();
       dao2.insertIntoArticlesChildren();
       dao1.commit();
       dao2.commit();   
    }catch(Exception e){
     dao1.rollback();
     dao2.rollback();
    }
}
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,dao1和dao2有两个不同的事务.但我需要在单个事务下进行翻转所以有没有办法在资源级别指定事务边界?

小智 3

看看这篇文章https://groups.google.com/forum/#!topic/jdbi/O5rxzwmlwjM

@CreateSqlObject 似乎就是答案。