gpt4 book ai didi

java - 如何在存在事务的情况下使代码可重用性成为可能?

转载 作者:行者123 更新时间:2023-11-29 04:05:25 26 4
gpt4 key购买 nike

在创建用于通过 Java 在 MySQL 数据库上运行查询的 API 时,我以下列方式创建了包含在 Hibernate session 和事务中的多个方法:

public void methodA(){
// Sessions & Transactions
hbu.createSession();
hbu.beginTransaction();

// Code here

hbu.commitTransaction();
hbu.closeSession();
}

但是,我似乎无法从其他类似方法中调用这些方法。我遇到的错误如下:

Exception in thread "main" java.lang.IllegalStateException: Transaction already active

我的理解是您不能在已创建的 session 中创建 session 。我可以复制被调用方法的代码并防止这种情况发生,但是,这显然会导致大量重复代码。处理此问题的标准方法是什么?

最佳答案

如何将事务处理集中在一个地方并将其他所有内容作为 lambda 传递?所以你只在一个地方拥有所有必要的 try-catch/finally 东西。

    void transactional(Runnable r) {
hbu.createSession();
try {
hbu.beginTransaction();
try {
r.run();
hbu.commitTransaction();
} catch (Exception e) {
hbu.rollbackTransaction();
// perhaps re-throw exception here
}
} finally {
hbu.closeSession();
}
}

void doSmthg(){
}

void doSmthgElse(){
doSmthg();
}

void useTransactional(){
transactional(() -> {
doSmthg();
doSmthgElse()
});

transactional(() -> doSmthg());
}

您还可以将 transactional() 进一步拆分为 2 个方法,一个用于 session 控制,另一个用于事务控制以在单个 session 中获取嵌套事务。

关于java - 如何在存在事务的情况下使代码可重用性成为可能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59152248/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com