2015-11-30 14 views
7

ich zwei jdbi dao wie diese hava:Mit @Transaction in JDBI/Dropwizard Anwendung

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

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

i wie Speichern von zwei dao in einer Transaktion ausgeführt werden soll:

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

mit spring ich habe verwendete @transactional Annotation. Was kann ich mit Dropwizard und Jdbi tun?

Antwort

10

Sie können @Transaction in JDBI verwenden. Ich habe hier darüber gebloggt. http://manikandan-k.github.io/2015/05/10/Transactions_in_jdbi.html

+0

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

+0

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

+0

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

-3

Verwenden @UnitOfWork

Beispiel:

@POST 
@UnitOfWork 
public Role create(@Valid RoleApi roleApi) { 
    return roleService.create(roleApi); 
} 
+1

@UnitOfWork Anmerkung wird nur mit Hibernate Bündel und nicht mit jdbi ein aktiviert Unter der Annahme. – LucaA

1

sich nach den jdbi Dokumente,

Update, Insert und die Datendefinitionsanweisungen im SQL API-Objekt über die angegeben sind @SqlUpdate Anmerkung. Die Methoden für diese -Anweisungen müssen entweder void- oder int-Rückgabetypen haben. Wenn der Rückgabewert int ist, entspricht der Wert der Anzahl der geänderten Zeilen.

Mit @SqlUpdate beschriften. Hier ist eine Beispielverwendung mit h2 als DB.

DBI dbi = new DBI("jdbc:h2:mem:test"); 
Handle h = dbi.open(); 
Dao1 dao1 = h.attach(Dao1.class); 
dao1.save(myBean1); 

Referenz: http://jdbi.org/sql_object_api_dml

2

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.

0

Sie können Transaktion Rückruf bei DBI verwenden:

dbi.useTransaction((handle, transactionStatus) -> { 
    Dao1 dao1 = handle.attach(Dao1.class); 
    Dao2 dao2 = handle.attach(Dao2.class); 
    dao1.save(); 
    dao2.save(); 
}); 

Sie verwenden JDBI v2.x

Verwandte Themen