[英]Hibernate long running conversations with persist() and save()
Hibernate文档指出,与save()
相比, persist()
对于与Session/Persistence context
长时间运行的对话很有用。
坚持()
这在具有扩展会话/持久性上下文的长时间对话中很有用。
救()
在具有扩展的会话/持久性上下文的长时间对话中,这是有问题的。
1)说Persistence context
是什么意思?
2)您能否举例说明什么是long-running conversations
? 这适用于Web应用程序吗?
谢谢!
更新: 这篇文章使我对第一个查询有了清晰的了解- Persistence context
为:
在运行时,只要打开和关闭会话,在这些打开和关闭边界之间,Hibernate就会在持久性上下文中维护对象。 可以将其视为休眠控件的一级运行时缓存。 Hibernate对持久性上下文中管理的实体进行自动的脏检查和事务后写。 Hibernate保证此缓存中Java对象身份的范围。 高速缓存中仅存在一个代表特定数据库行的对象实例。
对话是最终用户与UI的交互,以执行业务任务。 这种交互通常会跨越许多UI actions
。
Hibernate在与Hibernate session
关联的persistence context
中管理实体。 有两种模式可用于将Hibernate后端与UI前端集成:
每个会话的会话 :用户开始会话时会创建一个休眠会话,并保持活动状态,直到用户中止或结束会话。 当后者发生时,事务开始,会话被刷新并关闭,从而将SQL发送到数据库,事务被提交/回滚。
每个请求会话(UI操作) :用户执行UI操作时,将创建一个休眠会话。 对于每个事务开始的UI操作,将运行涉及该操作的代码,可以刷新和关闭会话,并提交/回滚事务。 开发人员负责re-attaching detached entities
先前在新会话中管理的re-attaching detached entities
(如果适用)。
第一种模式可能看起来更有吸引力,但是在实践中,尤其是当涉及到Web应用程序时,第二种模式是受青睐的,因为除非UI非常简单,否则它很容易实现。 您可能想看一下如何使用servlet过滤器open session in view
模式(每个请求模式的会话的另一个名称)实现open session in view
或者查找您选择的Web应用程序框架的文档以了解如何支持此方法。
要注意的另一件事是如何执行对话隔离(与数据库上的事务隔离类似的概念)。 这解决了两个同时使用相同数据的用户可能会覆盖彼此的更改的可能性。 看一下带有时间戳或版本的乐观锁定。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.