我喜欢这两个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做什么?
答案 0 :(得分:12)
您可以在JDBI中使用@Transaction。我在这里写了博客。 http://manikandan-k.github.io/2015/05/10/Transactions_in_jdbi.html
答案 1 :(得分:2)
SQL Object API Overview显示了将两个实例绑定到同一个句柄的可能性。这样,您可以将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
});
请使用单元测试仔细检查功能。
答案 2 :(得分:1)
根据jdbi docs,
更新,插入和数据定义语句显示在 SQL对象API通过
@SqlUpdate
注释。这些方法 语句必须具有void或int返回类型。如果退货 type是int,该值将是更改的行数。
使用@SqlUpdate
进行批注。这是使用h2作为数据库的示例用法。
DBI dbi = new DBI("jdbc:h2:mem:test");
Handle h = dbi.open();
Dao1 dao1 = h.attach(Dao1.class);
dao1.save(myBean1);
答案 3 :(得分: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
答案 4 :(得分:-4)
使用@UnitOfWork
示例:
@POST
@UnitOfWork
public Role create(@Valid RoleApi roleApi) {
return roleService.create(roleApi);
}