Die SQL Object API Overview zeigt die Möglichkeit, zwei Instanzen auf den gleichen Griff zu binden. Auf diese Weise können Sie beide save()
Anrufe als Teil derselben Transaktion:
// 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();
Wenn Sie onDemand
statt open
verwenden und zögern richtig zu machen try/catch, möchten Sie vielleicht etwas bedenken:
// 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
});
Bitte überprüfen Sie die Funktionalität mit einem Komponententest.
Hallo, danke das ist was ich brauche, aber wie kann ich die Klasse testen, die GetHandle Interface implementiert? Oder wenn Sie ein anderes Repository-Objekt in derselben Transaktion verwenden müssen? – LucaA
Wir können nicht zwei verschiedene Repositories in derselben Transaktion verwenden. Wenn Sie zwei verschiedene Daos verwenden möchten, erstellen Sie ein Repository mit diesen beiden Daos. Um die Klasse zu testen: Worin besteht die Schwierigkeit für dich? – Manikandan
können wir Daos im Einheitentest des Repositorys nicht vortäuschen, weil sie von jdbi @ SqlCreateObject Annotation und jdbi.onDemand Methode injiziert werden. Das ist wahr? – LucaA