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?
这将完全不起作用,它会抛出异常,因为它在事务块之外找不到任何活动事务。
我最近在学习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?
这将完全不起作用,它会抛出异常,因为它在事务块之外找不到任何活动事务。