Hibernate应用程序会话

时间:2015-09-08 10:45:30

标签: java hibernate

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

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

它发生了,因为有一种类似于应用程序会话的东西,它存储来自多个常规会话的detached个对象。

两个问题:

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

1 个答案:

答案 0 :(得分:1)

您正在处理的内容本质上是持久性上下文。从Hibernate API用户角度保留这些对象的主要原因是所谓的application transactions。大多数情况下,在操作的整个过程中保留有效的Hibernate(和DB)会话是不切实际的,特别是如果它涉及与用户的对话。完美的例子是一个用户,他已经被呈现出一个巨大的形式,他可以编辑一个对象的某些属性。你绝对不想在他编辑的整个过程中保持会话开放。

从广义上讲,拥有持久性语境对任何ORM解决方案都至关重要。详见here

  • 持久性上下文缓存有时可以帮助避免不必要的数据库流量;但更重要的是,它确保:

  • 在对象图中循环引用的情况下,持久层不容易受到堆栈溢出的影响。

  • 在工作单元末尾永远不会出现相同数据库行的冲突表示。在持久性上下文中,最多单个对象表示任何数据库行。对该对象所做的所有更改都可以安全地写入数据库。

  • 同样,在特定持久化上下文中进行的更改始终可以立即显示到持久化上下文及其工作单元内执行的所有其他代码(实体保证的可重复读取)。 / p>

  • 您无需执行任何特殊操作即可启用持久性上下文缓存。它始终打开,并且由于显示的原因,无法关闭。

永久缓存永远不会像会话一样被清除或刷新,并且出于上述原因,您不应强制它执行此操作。使用lock或saveOrUpdate重新附加实体。 如果你必须做某事,当然你可以开始克隆你的对象,重新启动持久化上下文等等,但这些可能不是干净的解决方案。