Hibernate在Transaction中使用openConnection并在Transaction之外使用getCurrentSession

时间:2016-08-24 01:53:05

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

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

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

但是有时我必须使用其他人的方法/代码/库/框架可能在里面使用openConnection(我无法更改他们的代码),我想知道,是什么这样做的后果?以这种方式获得的连接是否与getCurrentConnection相同(因为它在事务内部被调用)?还是有所不同?如果它不同,它是否会绑定到事务并由事务管理?虽然我说“由...管理”是指,事务上下文将其设置为auto-commit false,而在Transaction.commit时,事务将有助于提交更改(也可能用于回滚)?

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

1 个答案:

答案 0 :(得分:0)

  

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

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

  

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

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