Hibernate的会话会话和&查询未刷新的实体

时间:2010-11-03 10:14:21

标签: hibernate

这是上下文:

我们目前正在编写一个基于Web的应用程序(flex前端)。服务器端使用Java实现,使用hibernate进行ORM 该应用程序的特殊性在于它实现了与用户的对话。这意味着用户正在打开对话,在决定保存(或取消)对话之前,它会对映射为休眠实体的对象执行许多操作。

例如:

  • 打开对话
  • 创建一个对象A
  • 将其保存在会话中
  • 查询
  • 更新
  • 等...
  • 保存对话(刷新会话......)

然后另一个对话周期开始。

我们自然选择了每会话会话模式来实现这种工作方式 让我提醒你原则:
当用户决定开始对话时,hibernate会话被创建一次,其刷新模式被设置为MANUAL,从现在开始,每次事务之间都会断开连接,直到用户决定结束对话,这是我们明确刷新对话的唯一时间。 session(从而将会话中的数据写入DB)。


修改
在每会话会话模式中,每个操作都在提交的事务中进行。例如,假设我们有两个服务,一个名为addObject(),另一个名为getObject() 该过程如下:

  • 打开一个对话(=>会话创建时将刷新模式设置为MANUAL并将其绑定在持有当前会话的ManagedSessionContext中)
  • 调用addObject()服务,该服务获取会话会话,打开事务,创建实体,保存,断开会话并最终提交事务
  • 调用getObject()服务,该服务获取会话会话,打开传输,获取对象,断开会话并最终提交事务
  • 通过打开交易,刷新会话然后提交交易来保存对话。

在这里,我们看到我无法在不提交事务的情况下刷新会话,因为目标正是在每次类似服务的操作之后提交事务。


在我们想要查询一些未刷新的实体之前,我们完全没有问题!因为如果我们想要使用这种对话,那是因为我们希望处于“模拟”状态,直到我们明确刷新会话。 但似乎无法使用hibernate标准或HQL加载未刷新的实体,除非在会话上执行flush(),这会导致会话每会话模式的所有好处...

所以我的问题是:

我们可以配置此行为吗? (即如果会话未刷新,我们是否可以启用查询会话缓存事件?)

似乎答案是否定的(任何反对者都会受到欢迎!),第二个问题: 是否有一种聪明的方法可以自己制作它而不会歪曲可能的智能和考虑过的hibernate的做法?

希望我的英语是可以理解的,我提前感谢你们。 (让我确切地说,这个问题也已发布到hibernate用户论坛)

1 个答案:

答案 0 :(得分:1)

来自Hibernate API

  

刷新是将底层持久存储与内存中保持的持久状态同步的过程。

Flush并不一定意味着您将更改写入数据库。这意味着内存中的状态是最新的。如果您的数据库不支持事务,或者您不在事务中工作,则Flush仅将更改写入数据库。

如果您使用事务并且您的数据库支持事务,例如MySQL和InnoDB,那么您可以随时刷新而无需向DB写入任何内容。在您致电Transaction.commit()之前,更改不会写入数据库。