【问题标题】:Hibernate use openConnection inside Transaction and use getCurrentSession outside of TransactionHibernate 在 Transaction 内部使用 openConnection 并在 Transaction 外部使用 getCurrentSession
【发布时间】:2016-08-24 01:53:05
【问题描述】:

我最近在学习Hibernate,它让我很头疼,因为我在我的应用程序中一直使用DataSource.getConnection,在Hibernate中学习Session概念是相当困难的。我也无法从 API/Doc 中找到足够的信息或确认信息。

我已经阅读了this。我知道如果我有一个容器管理的事务(我使用 HibernateTransactionManager 并且主要使用 Spring 的 Transactional 注释),大多数时候,我应该使用 getCurrentConnection(内部事务),因为它将返回我唯一绑定到事务上下文的连接。

但有时我必须使用其他人的方法/代码/库/框架,可能内部将使用openConnection(我无法更改他们的代码),我想知道,结果是什么这样做?这样得到的连接会不会和getCurrentConnection是同一个会话(因为在事务内部调用)?还是不一样?如果不同,它是否也会绑定到事务并由事务管理?当我说“由管理”的意思时,事务上下文会将其设置为auto-commit false,在Transaction.commit 时,事务将有助于提交更改(也可能用于回滚)?

它扩展了我的想法,如果我在事务之外调用getCurrentConnection 会怎样?没有事务上下文,那么返回的连接是什么?以及连接绑定到哪里?基于这个doc,我可以看到这样做是有效的,但它没有解释后果是什么。

【问题讨论】:

    标签: hibernate jakarta-ee transactions connection database-connection


    【解决方案1】:

    但有时我不得不使用其他人 可能内部将使用的方法/代码/库/框架 openConnection(我无法更改他们的代码),我想 知道,这样做的后果是什么?

    好的,我已经测试了上面的代码,它将创建一个新的休眠会话,这意味着我必须手动处理会话,包括关闭它并刷新它。

    它扩展了我的想法,如果我在外面调用 getCurrentConnection 会怎样 交易?

    这将完全不起作用,它会抛出异常,因为它在事务块之外找不到任何活动事务。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-24
      • 2022-12-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-27
      相关资源
      最近更新 更多