Hibernate 在 Transaction 内部使用 openConnection 并在 Transaction 外部使用 getCurrentSession

Hibernate use openConnection inside Transaction and use getCurrentSession outside of Transaction

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

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

但有时我不得不使用其他人method/code/library/framework,可能里面会使用openConnection(我无法更改他们的代码),我想知道,什么是这样做的后果?这样获得的连接会不会和getCurrentConnection是同一个session(因为是在事务内部调用的)?或者它是不同的?如果不同,它会绑定到事务并由事务管理吗?虽然我说 "managed by" 的意思是,事务上下文会将其设置为 auto-commit false 并且在 Transaction.commit 上,事务将有助于提交更改(也可能用于回滚)?

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

But sometime I have to use some other people method/code/library/framework that possibly inside will be using openConnection (I am not able to change their code), I would like to know, what is the consequence of doing this?

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

It extends my thought, what if I called getCurrentConnection outside of the Transaction?

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