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
});
Пожалуйста, дважды проверьте функциональность с помощью модульного теста.
Привет, спасибо, это то, что мне нужно, но как я могу проверить класс, который реализует интерфейс GetHandle? Или если нужно использовать другой объект репозитория в одной транзакции? – LucaA
Мы не можем использовать два разных хранилища в одной транзакции. Если вы хотите использовать два разных Дао, создайте репозиторий, содержащий эти два Daos. Для тестирования класса, с какими трудностями вы сталкиваетесь? – Manikandan
, мы не можем издеваться над daos в модульном тесте репозитория, потому что им вводят jdbi @SqlCreateObject аннотацию и метод jdbi.onDemand. Это правда? – LucaA