在创建用于通过 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/