目前正在學習使用 hibernate-reactive 的兵變和事務。我需要將混亂物件保存在資料庫中,如果有特定條件,我想回滾發送某種失敗訊息作為保存方法的回傳引數的事務。
我怎么能產生Failure 或 Exception。在這種情況下,最佳做法是什么。
您能否向我展示一個使用此代碼段的示例。
public Uni<Mess> save(Mess mess) {
return Panache.withTransaction(() -> {
if(mess.message.equals("Hello World")){
Panache.currentTransaction().invoke(Transaction::markForRollback).subscribe().with(item -> Log.info("Transaction is marked for roll-back"));
}
return persist(mess);
});
}
uj5u.com熱心網友回復:
這取決于您是否認為這是一個例外。
您可以使用Uni.createFrom().failed(...). 因此,重寫示例的一種方法是:
public Uni<Mess> save(Mess mess) {
return Panache.withTransaction(() -> {
if (mess.message.equals("Hello World")) {
return Panache.currentTransaction()
.invoke(Mutiny.Transaction::markForRollback)
.invoke(() -> Log.info("Transaction is marked for roll-back"))
.chain(() -> Uni.createFrom().failure(new RuntimeException()));
}
return persist(mess);
}
}
如果您不認為這是失敗,您可以使用
Uni.createFrom().nullItem()or回傳其他內容Uni.createFrom().item(...)。
要記住的一件事是會話應該被丟棄,以防在使用它時發生例外。Panache 無法處理這種情況。 有一個關于這個的問題,并且有一些解決方法的討論。但是,簡而言之,一種解決方法是直接使用 Hibernate Reactive:
@Inject
Mutiny.SessionFactory factory;
public Uni<Void> create(Person person){
return factory.withTransaction( (session, tx) -> {
// Now you have a new session and transaction and you can control them any way you want
});
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/517453.html
標籤:休眠夸库斯派兵变休眠反应
