首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Hibernate应用会话

Hibernate应用会话
EN

Stack Overflow用户
提问于 2015-09-08 10:45:29
回答 1查看 63关注 0票数 1

在Hibernate中,我们可以打开/关闭多个会话。例如,我们可以

  • 打开session1,持久化Obj1 (id=1,.),关闭session1
  • 打开session2,加载完全相同的Obj1 (id=1,.)saveOrUpdate(obj1)-它会导致NonUniqueException

之所以会发生这种情况,是因为有一些类似于应用程序会话的东西,它存储来自多个常规会话的detached对象。

两个问题:

  1. 为什么Hibernate要维护这样的应用程序会话?
  2. 这样的会话什么时候被刷新/清除?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-08 11:24:49

所处理的本质上是持久化上下文,从Hibernate API用户的角度来看,保留这些对象的主要原因是所谓的应用事务。大多数情况下,将有效的Hibernate (和DB)会话保留在操作的全部时间是不实际的,特别是当它涉及到与用户的对话时。完美的例子是一个用户,他已经给出了一个巨大的表单,在那里他可以编辑对象的某些属性。你绝对不想让一个会话在他编辑的整个时间都是开放的。

更广泛地说,拥有持之以恒的上下文对于任何ORM解决方案都是必不可少的。正如在细节中所描述的,这里

  • 持久性上下文缓存有时有助于避免不必要的数据库流量;但更重要的是,它确保:
  • 在对象图中循环引用的情况下,持久化层不会受到堆栈溢出的影响。
  • --在工作单元结束时,对同一数据库行的表示永远不会冲突,。在持久性上下文中,最多一个对象表示任何数据库行。对该对象所做的所有更改都可以安全地写入数据库。
  • 类似地,在特定持久性上下文中所做的更改对于在该持久性上下文及其工作单元中执行的所有其他代码都是立即可见的(可重复读取实体保证)。
  • 您不必做任何特殊的事情来启用持久性上下文缓存。它总是开着,因为所显示的原因,不能关闭。

持久化缓存从未像会话一样被清除或刷新,出于上述原因,您不应该强迫它这样做。使用lock或saveOrUpdate重新附加实体。如果您必须做一些事情,当然您可以开始克隆对象、重新启动持久性上下文等等,但是这些可能不是干净的解决方案。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32455716

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档