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

标签 java

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

相关文章:

java - Hadoop 文件系统中目录的路径是什么?

java - connectionTimeout 和 keepAliveTimeout 之间的 Tomcat 连接器关系

java - 画出麦克风输入的轮廓

java - 在java中没有主要功能的打印

java - 什么是 "non-static method"错误以及 "this"是如何工作的?

java - 为什么我无法实例化这个变量?

java - IBM MQ 云连接

java - java中的Unicode到String但很棘手

java - "java.vendor"和 "java.vm.vendor"有什么区别?

java - 将图像插入 vaadin 网格