12

我有两个这样的 jdbi dao:

public interface dao1 {
  @Query("insert into table1 ...")
  findByid(myBean1);
}

public interface dao2 {
  @Query("insert into table2 ...)
  save(myBean2;
  }
}

我想在一个事务中执行两个 dao 的保存,例如:

dao1.save();
dao2.save();

在 spring 中,我使用了@transactional 注释。我可以用 dropwizard 和 jdbi 做什么?

4

5 回答 5

12

您可以在 JDBI 中使用 @Transaction。我在这里写了博客。http://manikandan-k.github.io/2015/05/10/Transactions_in_jdbi.html

于 2015-12-03T10:36:15.710 回答
2

SQL 对象 API 概述显示了将两个实例绑定到同一个句柄的可能性。这样,您就可以save()作为同一事务的一部分进行调用:

// TODO: add try/catch/finally to close things properly
DBI dbi = new DBI("jdbc:h2:mem:test");
Handle h = dbi.open();
h.begin();
Dao1 dao1 = h.attach(Dao1.class);
Dao2 dao2 = h.attach(Dao2.class);
dao1.save(myBean1);
dao2.save(myBean2);
h.commit();
h.close();

如果您使用onDemand而不是open并且犹豫是否正确尝试/捕获,您可能需要考虑这样的事情:

// add some more interfaces
public interface Dao1 extends GetHandle, Transactional<Dao1> {
   @Query("insert into table1 ...")
   save(myBean1);
}

DBI dbi = new DBI("jdbc:h2:mem:test");
Dao1 dao1 = dbi.onDemand(Dao1.class);

// no try/catch necessary here
dao1.inTransaction(transactional, status) -> {
    transactional.save(myBean1);
    transactional.withHandle((h) -> h.attach(Dao2.class)
       .save(myBean2));
    return null; // return is enforced by the interface
});

请通过单元测试仔细检查功能。

于 2015-12-02T20:21:11.547 回答
0

根据 jdbi 文档,

更新、插入和数据定义语句通过@SqlUpdate注释在 SQL 对象 API 中指示。这些语句的方法必须具有 void 或 int 返回类型。如果返回类型为 int,则该值将是更改的行数。

用 注释@SqlUpdate。这是使用 h2 作为数据库的示例用法。

DBI dbi = new DBI("jdbc:h2:mem:test");
Handle h = dbi.open();
Dao1 dao1 = h.attach(Dao1.class);
dao1.save(myBean1);

参考:http: //jdbi.org/jdbi2/sql_object_api_dml

于 2015-12-02T01:54:46.530 回答
0

您可以在 DBI 上使用事务回调:

dbi.useTransaction((handle, transactionStatus) -> {
    Dao1 dao1 = handle.attach(Dao1.class);
    Dao2 dao2 = handle.attach(Dao2.class);
    dao1.save();
    dao2.save();
});

假设您使用的是 JDBI v2.x

于 2017-10-30T17:10:03.750 回答
-6

使用@UnitOfWork

例子:

@POST
@UnitOfWork
public Role create(@Valid RoleApi roleApi) {
    return roleService.create(roleApi);
}
于 2015-12-01T09:20:33.420 回答