当前位置: 首页 > 知识库问答 >
问题:

Hibernate会话与事务

仉臻
2023-03-14

我对Hibernate中的会话和事务的概念有点困惑。据我所知,Hibernate使用会话(持久性上下文),它基本上是需要持久,删除或数据库中任何内容的实体的缓存。会话封装事务,因此我启动一个会话,然后创建一个事务。事务关闭后,持久性上下文中的所有内容都将刷新到数据库,如果我关闭会话,也会发生同样的事情。

为什么我需要两者?我可以在不创建交易的情况下做同样的事情吗?

共有1个答案

逄学潞
2023-03-14

首先,您可以在同一个会话中打开1个以上的事务。

现在,刷新不一定与事务提交相关。当您< code>save()一个实体时,如果您使用身份生成策略,它将被刷新。当您< code >选择某项时,会话也将刷新(如果刷新模式为自动)。您甚至可以告诉Hibernate在事务提交之前不要刷新(手动刷新模式)。

事务只负责ACID,它是一个数据库特性。Session负责管理实体、生成SQL、处理事件。这是Java的事情。

PS: Session不仅仅是一个“缓存”。这也是跟踪哪些实体被更改的一种方式。所以这不仅仅是一个优化技巧。

 类似资料:
  • 我在学习冬眠时遇到了一个问题。我写了UnitTest和那里我尝试添加对象到DB。所有选择都正常工作,但插入不正常。 我也尝试过这样的东西 它引发了一个异常,事务没有成功启动,但它添加了用户 这里有一个例外 组织。springframework。交易TransactionSystemException:无法回滚Hibernate事务;嵌套的异常是org。冬眠TransactionException:

  • 我指的是https://developer.jboss.org/wiki/SessionsAndTransactions,目前正试图了解与JTA的划界问题。它声明在使用getCurrentSession()的特定事务中,总是给出相同的当前会话。是不是意味着: < li >如果另一个用户在另一个线程中执行同一段代码(通过查找获取一个事务,然后使用getCurrentSession()并关闭该事务),

  • Spring MVC+Hibernate、JavaConfig WebAppConfig: 用户 HTTP状态500-请求处理失败;嵌套异常为org.springframework.transaction.CanNotCreateTransactionException:无法打开事务的Hibernate会话;嵌套异常为java.lang.NoClassDefoundError:org/hibern

  • 监听器类提供给开发人员一种跟踪 Web 应用内会话的方式。它通常是有用的,在跟踪会话知道一个会话是否变为失效,因为容器超时会话,或因为应用内的一个 Web 组件调用了 invalidate 方法。该区别可能会间接地决定使用监听器和 HttpSession API方法。

  • 摘自Java Persistence with Hibernate(Manning,2007)第419页: 我应该在会话上使用持久化()吗?Hibernate会话接口还具有一个持久化()方法。它与JPA的持久化()操作具有相同的语义学。但是,这两种操作在刷新方面有一个重要的区别。在同步期间,Hibernate会话不会将持久化()操作级联到关联的实体和集合,即使您使用此选项映射了关联。它只级联到调用

  • 问题内容: 我将Spring + Hibernate用于需要创建和更新数十万个项目的操作。像这样: 为了防止自己丢失中间的更改,我会在之后立即提交更改: 在这一点上,我不得不说整个过程都在包装成的事务中运行(是的,这是一个webapp)。 这一切都很好,但有一个例外:经过数千次更新/提交后,整个过程确实变慢了,这很可能是由于Spring / Hibernate保存的对象数量不断增加而导致内存膨胀。