12

私はこれらのような2つのjdbi daoを持っています:

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

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

次のように 1 つのトランザクションで 2 つの dao の保存を実行したい:

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

春には @transactional アノテーションを使用しました。dropwizard と jdbi で何ができますか?

4

5 に答える 5

2

SQL オブジェクト APIの概要は、2 つのインスタンスを同じハンドルにバインドする可能性を示しています。このようにして、両方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代わりにtry/catchを使用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 に答える
-6

@UnitOfWork を使用

例:

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