当前位置: 首页 > 知识库问答 >
问题:

不提交Hibernate选择事务的后果

从智志
2023-03-14

我不熟悉Hibernate,并且继承了使用它的代码库。未定义自动提交,因此默认情况下为false。不过,基于我提出的其他问题,答案表明,最佳做法是对代码进行标定,以便在开始事务时始终应该提交()或回滚()(多亏了Apostolos)。该代码库使用以下代码中的格式来表示Select语句。我打算将任何新代码正确地划分为commit()或rollback(),但我只是好奇使用下面的模型会产生什么后果。应用程序已经并将继续正常工作,但我想了解现有代码是否有任何问题。

this.session = HibernateUtil.getSessionFactory().getCurrentSession();    
Transaction tx = session.beginTransaction();
session.clear();
entityReturned = (MultipleKeyTable) session.get(MultipleKeyTable.class, entityId);
session.close();

共有2个答案

谢昊乾
2023-03-14

我建议有几个改进:

>

  • 将SessionFactory存储为会话作为类的成员:因为您在完成工作后关闭了会话对象,所以您不可能重用此实例,因此您将需要可以从SessionFactory检索的新实例;

    不要调用clear()方法:因为您正在使用当前会话对象,调用clear()可能会删除持久性上下文中但尚未在数据库中刷新的所有对象,所以您可能会丢失数据;

    完成工作后提交或回滚事务。

    因此,代码必须是:

         this.sessionFactory = HibernateUtil.getSessionFactory();
         Session session = this.sessionFactory.getCurrentSession();    
         Transaction tx = session.beginTransaction();
    
         entityReturned = (MultipleKeyTable) session.get(MultipleKeyTable.class, enti
    
         transaction.commit();
         session.close();
    

  • 姚信鸥
    2023-03-14

    会话。close()“通过释放JDBC连接并清理结束会话”(HibernateSharedSessionContractdocs)。这并不像我想的那么明确,但我能想到的每一个关于“释放JDBC连接”的合理解释都意味着以某种方式结束任何打开的事务。尽管如此,仅仅关闭会话而不是显式结束事务充其量也是草率的。

    值得一提的是,会话文档推荐了这样一个成语:

    Session sess = factory.openSession();
    Transaction tx = null;
    try {
        tx = sess.beginTransaction();
        //do some work
        ...
        tx.commit();
    }
    catch (Exception e) {
        if (tx!=null) tx.rollback();
        throw e;
    }
    finally {
        sess.close();
    }
    

    如果需要,可以在关闭会话之前在同一会话中运行多个事务。

     类似资料:
    • 我目前正在Spring玩番石榴的eventbus,虽然一般功能运行良好,但到目前为止,我遇到了以下问题: 当用户希望更改“行”实体上的数据时,这将在后端服务中照常处理。在这个服务中,数据将首先通过JPA持久化,然后我创建一个“NotificationEvent”,引用已更改的实体。通过EventBus,我将线路参考发送给所有订阅者。 eventbus本身是在后台使用new eventbus()创建

    • 问题内容: 考虑: 提交表单时,如何确保下拉列表中的选定值保持选中状态?此表单位于WordPress(PHP)内部。 问题答案: 为了避免许多if-else结构,让JavaScript自动完成:

    • 我正在处理一些旧的应用程序代码,其中似乎涉及到几个概念,因此我希望能够将它们改进为一个坚实而严格的实践。 基本上,整个代码都用这样的HibernateSessionRequest estFilter包装 然后,有一个拦截器,做这样的事情 然后还有更多的业务逻辑代码,包括更多的初始事务和会话清除等。 那么,问题是: 当在同一会话中多次调用beginTransaction时会发生什么 非常感谢。

    • 一些背景知识,我在我的web应用程序中使用JPA/Hibernate/Spring,我也使用org。springframework。orm。jpa。支持OpenEntityManagerViewFilter和用于处理实体的扩展持久性上下文。 问题: > 使用find方法从数据库加载实体,实体存储在会话中 用户更改实体并点击保存 用户更改反映在会话中存储的实体上(在控制器中) 实体被发送到服务类中的

    • 我正在使用手动事务时插入/更新3个表。我想在事务提交后立即插入到历史表中。这意味着有3个操作(针对每个表),只有在提交这些操作之后,我才希望调用一个方法。 这是我的代码: 有什么post commit方法吗?如何在提交之后而不是持久之后调用方法?

    • 问题内容: 事务成功或回滚后,我需要调用某些方法。我正在使用 该应用程序使用一些外部Web服务,这些内部Web服务在回滚内部事务时需要“清除”。有没有办法在不使用声明式事务管理的情况下完成此操作。 问题答案: 在Hibernate中,您可以扩展和覆盖 方法并将其注册在 或中。 在Spring中,您可以使用扩展,覆盖和注册 。 编辑 使用Spring Aop向所有带注释的方法添加同步的示例