Hibernate中Session和Connection之间的区别是什么?

19

我想澄清基本的三点:

在旧会话上开始新的数据库事务是否获得新连接并恢复会话?

提交数据库事务是否断开JDBC连接中的会话并将连接返回到池中?

根据Hibernate文档,早期版本的Hibernate需要显式断开和重新连接会话。这些方法已被弃用,因为开始和结束事务具有相同的效果。它们怎么有相同的效果呢?

1个回答

34

Hibernate Session是一个事务性的写入缓存,将实体状态转换为DML语句。Hibernate Session可以连接或断开与数据库的连接。当它断开连接时,它无法将当前挂起的实体状态更改刷新到底层数据库。

有多种方法将Hibernate Session与数据库事务关联:

  • 每个请求一个session (会话绑定到单个逻辑@Transaction和一个物理数据库事务的生命周期)
  • 长时间的对话 (会话可以跨越多个@Transaction操作,因此涉及多个数据库事务)

在处理数据库事务时,有两种不同的方法:

  • RESOURCE_LOCAL事务,使用单个数据源始终将物理数据库事务绑定到Hibernate Session(在单个逻辑事务的上下文中,这意味着您仍然可以实现长时间的对话以跨越多个这样的逻辑事务)。

  • JTA,使用多个数据源。JTA状态表明连接应在每个语句之后积极释放,但实际上,在单个逻辑事务的上下文中,您仍将获得相同的JDBC连接句柄。

现在回答你的问题:

  1. 在旧会话上开始新的数据库事务是否会获得新连接并恢复会话?

是的。Hibernate会话将重新连接,刷新/提交可以继续进行。

  1. 提交数据库事务是否会断开会话与JDBC连接并将连接返回到池中?

默认情况下,当您提交事务时,会话将关闭,底层连接也将关闭。如果您使用连接池,则数据库连接确实会返回到池中。

  1. 根据Hibernate文档,早期版本的Hibernate需要显式断开和重新连接会话。这些方法已被弃用,因为事务的开始和结束具有相同的效果。它们如何具有相同的效果?
这些方法已被弃用,因为连接管理现在由连接释放模式控制。

对于我的第二个问题,您提到:“默认情况下,当您提交事务时,会话将关闭..”。那么,在我提交后为什么需要session.close()呢?也就是说,关闭会话和断开会话确实是两回事吗? - Farhan stands with Palestine
1
您可以拥有一个会话和多个事务。这通常发生在扩展持久化上下文的情况中。当您结束对话时,您将拥有多个只读事务和一个写入事务。 - Vlad Mihalcea
那么你所说的“默认情况下,当您提交事务时,会话将关闭”是什么意思?这是使用声明性@Transaction的每个请求一个会话的情况吗? - Ekaterina
是的,对于标准的每个请求会话。 - Vlad Mihalcea

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接