使用persist()和save()Hibernate长时间运行的对话

时间:2014-01-07 20:06:50

标签: java hibernate

Hibernate document表示persist()save()相比,与Session/Persistence context

的长时间对话比较有用Persistence context

坚持()

  

这对于使用扩展的长时间对话非常有用   会话/持久化上下文。

保存()

  

这与长期对话有争议   会话/持久化上下文。

1)当它说long-running conversations时意味着什么?

2)你能提供一个关于Persistence context的例子吗?这适用于Web应用程序吗?

谢谢!

更新 This post让我清楚地了解了我的第一个问题 - {{1}}:

  

在运行时,只要打开和关闭会话,就会打开这些会话   和封闭边界Hibernate在Persistence中维护对象   语境。可以把它想象成休眠的第一级运行时缓存   控制。 Hibernate执行自动脏检查和事务处理   在Persistent Context中管理的实体的后写。过冬   保证此缓存中的Java对象标识范围。只有一个   表示特定数据库行的对象实例存在于   高速缓存中。

1 个答案:

答案 0 :(得分:4)

对话是最终用户与UI的交互,以执行业务任务。此互动通常会跨越许多UI actions

Hibernate管理与Hibernate persistence context关联的session中的实体。有两种模式用于将Hibernate后端与UI前端集成:

每次会话的会话:在用户开始对话时创建一个休眠会话,并在用户中止或完成对话之前保持活动状态。当后者发生时,事务开始,会话被刷新并关闭,从而将SQL发送到数据库并且事务被提交/回滚。

每个请求的

会话(UI操作):当用户执行UI操作时,会创建一个hibernate会话。对于事务开始的每个UI操作,运行涉及此操作的代码,可以刷新和关闭会话,并提交/回滚事务。如果适用,开发人员负责re-attaching detached entities之前在新会话中管理的人员。

第一种模式可能看起来更具吸引力,但实际上,尤其是当涉及Web应用程序时,第二种模式更受青睐,因为除非UI非常简单,否则实现起来要容易得多。您可能希望了解如何使用servlet过滤器实现open session in view模式(每个请求模式的会话的另一个名称),或者查看您选择的Web应用程序框架的文档,了解它是如何支持的。

另一件需要注意的事情是如何执行会话隔离(与数据库上的事务隔离类似的概念)。这涉及两个同时使用相同数据的用户可能会覆盖彼此更改的可能性。看一下带时间戳或版本的乐观锁定。