当前位置: 首页 > 面试题库 >

处理休眠事务

南门向荣
2023-03-14
问题内容

目前,我在 每个 Controller方法中 重复了以下代码:

Transaction transaction = HibernateUtil.getSessionFactory().getCurrentSession().getTransaction();
if (!HibernateUtil.getSessionFactory().getCurrentSession().getTransaction().isActive()) {
    transaction.begin();
}

这是正确的方法还是有更好的方法,也许在一个我可以引用的单独的类中?如果是这样,怎么办?每当我尝试将其放在单独的类中并从其他类中引用它时,它都会失败。

编辑 :我正在尝试使用尽可能少的外部库。如果Java在JDK中内置了ORM / JPA实现,我就不会使用Hibernate。


问题答案:

我本人已经遇到了很多次。通常,我的第一个建议是Spring事务管理,但是据我了解,您正在尝试限制所使用的第三方库的数量。

由于您在HibernateUtil类中使用静态API,因此您可能会发现将逻辑合并到方法中并将“您要在事务中执行的操作”代码(因控制器而异)放在回调中可能会有所帮助。

首先,定义一个接口来描述每个控制器的inTransaction行为:

public interface TransactionCallback {
    void doInTransaction();
}

现在,在您的HibernateUtil类中创建一个静态方法来处理开始,提交,并在必要时回滚事务:

public class HibernateUtil {
    public static void inTransaction(TransactionCallback tc) {
        Transaction transaction = HibernateUtil.getSessionFactory().getCurrentSession().getTransaction();
        if (!HibernateUtil.getSessionFactory().getCurrentSession().getTransaction().isActive()) {
            transaction.begin();
            try {
                tc.doInTransaction();
                transaction.commit();
            } catch (Exception e) {
                transaction.rollback();
            }
        }
    }
}

在控制器中,您可以将新方法与匿名内部类一起使用:

....
    HibernateUtil.inTransaction(new TransactionCallback() {
        void doInTransaction() {
            // do stuff for this controller
        }
    });
....

这种方法至少应该照顾好您要消除的重复项,并且有足够的扩展空间来处理特定的异常等。



 类似资料:
  • 问题内容: 我有一个“复杂”的问题。 我正在使用Hibernate / JPA与数据库进行事务。 我不是DBA,客户端使用了我的应用程序,即RESTful Web服务。我的问题是数据库已更改(不是很频繁,但仍在更改)。另外,客户端并不总是尊重我的应用程序的输入(长度,类型等)。发生这种情况时,Hibernate会引发异常。异常很难翻译和从日志中读取,因为它具有嵌套的异常并且由很多文本组成:就像我说

  • 问题内容: Hibernate 文档显示了以下示例: 即使仅打印了事件列表,为什么仍需要执行? 问题答案: SELECT还需要事务。没有任何事务就无法执行SELECT。使用某些SQL GUI工具从数据库中选择数据时,不必显式启动和结束事务,这是因为这些工具正在使用自动提交模式。在自动提交模式下,数据库将为每个SQL语句自动启动并提交事务,这样您就不必显式声明事务边界。 如果您不结束(即提交或回滚)

  • 问题内容: 我有一个dao,它基本上使用hibernate将记录插入到一​​个表中,该dao用标记为注释,并且我有一个服务,该服务会生成其他一些东西,然后调用我的dao。我的服务也标注了使用。 我叫服务循环。我在dao上的插入内容是否可以批量或一个接一个地工作?我如何确定它们可以批量工作?hibernateTransaction Manager是否管理批处理插入? 我正在使用Oracle DB。

  • 问题内容: 在编写批处理文件以自动执行Windows框上的某些操作时,我需要将其执行暂停几秒钟(通常在测试/等待循环中,等待进程启动)。当时,我能找到的最佳解决方案是使用ping(我不骗你)来达到预期的效果。我已经找到了更好的写了它在这里,它描述了一个可调用“wait.bat”,实现如下: 然后,你可以在自己的批处理文件中包含对wait.bat的调用,传递进入睡眠的秒数。 显然Windows 20

  • 问题内容: 我有一个专门用于通过休眠的持久层将数据持久保存在db中的类。 问题在于它不保留数据。 堆栈是: 但我必须指出,它在其他课程中也能正常工作。 更新 : 当我把它印出来的时候给我。 更新 我试图获得更多有关该错误的信息: 我知道问题出在哪里: 实际上,该表对同一张表有2 fk ,而我,我坚持的是 问题答案: 可能引发了异常。这意味着该子句中没有要回滚的活动事务。这就是为什么引发另一个异常(

  • 问题内容: 在过去的几天中,我尝试使用MOXy JAXB支持对Hibernate模型的XML编组/解组。尝试执行此操作时,我遇到了hibernate代理对象的问题。考虑类似: 我尝试通过以下方式使用MOXy JAXB映射此代码: 我的问题是,hibernate实例化了通过在User上调用getAddress()获得的地址的代理对象。然后,当JAXB尝试封送对象时,它无法发现它实际上是它要封送的Co