hibernate 如何在华而不实的变种管道中回滚失败

643ylb08  于 2022-11-14  发布在  其他
关注(0)|答案(1)|浏览(120)

目前正在学习兵变和交易与休眠-React性。我需要将Mess对象保存在数据库中,如果有特定的条件,我想回滚事务,发送某种失败消息作为save方法的返回参数。
我如何产生失败或异常。在这种情况下,最佳做法是什么?
你能给我展示一个使用这个代码片段的例子吗?

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);
                            });
        }
whhtz7ly

whhtz7ly1#

这取决于你是否认为这是一个例外。
您可以使用Uni.createFrom().failed(...)创建出现故障的UNI。因此,重写您的示例的一种方法是:

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()Uni.createFrom().item(...)返回其他内容。
要记住的一件事是,会话应该被丢弃,以防在使用它时发生异常。帕纳奇不能处理这种情况。There is an issue about this,并讨论了一些解决方法。但是,简而言之,一种解决方法是直接使用休眠React式:

@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 
    });
}

相关问题