java - hibernate 应用程序 session

标签 java hibernate

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

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

它会发生,因为显然存在类似应用程序 session 的东西,它存储来自多个常规 session 的分离对象。

两个问题:

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

最佳答案

您所处理的本质上是持久性上下文。从 Hibernate API 用户的角度来看,保留这些对象的主要原因是所谓的 application transactions 。大多数时候,在整个操作过程中保留有效的 Hibernate(和 DB) session 是不切实际的,特别是当它涉及与用户的对话时。完美的例子是,用户看到了一个巨大的表单,他可以在其中编辑对象的某些属性。您绝对不想在他进行编辑的整个过程中保持 session 打开。

从更广泛的角度来说,拥有持久性上下文对于任何 ORM 解决方案都是至关重要的。详细描述here :

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

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

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

  • 同样,在特定持久性上下文中所做的更改始终立即可见对该持久性上下文及其工作单元内执行的所有其他代码(实体的可重复读取保证)。

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

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

关于java - hibernate 应用程序 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32455716/

相关文章:

java - Java if语句,仍然执行“Else”

java - 为什么在更改 Android 中的区域时 DateTimeZone.getDefault() 不会更新

java - Hibernate OneToMany SELECT 在实体映射中给出重复列

hibernate - JPA 坚持变得越来越慢

java - Hibernate 相对于基于数据库表和存储过程生成的 DAL 有何优势?

java - 使用 Java 和 Hibernate 从存储过程获取返回值(标量),而不是结果表

java - JSR-303 和 Spring MVC 绑定(bind)结果

java - 在 Java 中使用反射时如何避免父对象方法

java - 如何处理继承?

java - org.hibernate.ObjectDeletedException : deleted instance passed to merge