Il SQL Object API Overview mostra la possibilità di legare due istanze per lo stesso handle. In questo modo è possibile sia save()
chiamate come parte della stessa transazione:
// 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();
Se si utilizza onDemand
invece di open
e esitate a try/catch a destra, si potrebbe prendere in considerazione qualcosa di simile:
// 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
});
Si prega di ricontrollare la funzionalità con un test dell'unità.
Ciao, grazie questo è ciò di cui ho bisogno, ma come posso testare la classe che implementa l'interfaccia GetHandle? O se è necessario utilizzare diversi oggetti repository nella stessa transazione? – LucaA
Non possiamo utilizzare due diversi repository nella stessa transazione. Se vuoi usare due Dao diversi, crea un repository contenente quei due Dao. Per testare la classe, qual è la difficoltà che stai affrontando? – Manikandan
non possiamo prendere in giro daos nel test unitario del repository, perché sono iniettati dall'annotazione jdbi @SqlCreateObject e dal metodo jdbi.onDemand. È vero? – LucaA