【问题标题】:NHibernate Flush-- How it works?NHibernate Flush——它是如何工作的?
【发布时间】:2010-10-21 07:30:58
【问题描述】:

我对 NHibernate 中的 Flush(和 NHibernate.ISession)如何工作感到有些困惑。

从我的代码看来,当我使用ISession.Save(entity)保存对象时,可以直接将对象保存到数据库中。

但是,当我使用ISession.SaveOrUpdate(entity)ISession.Update(entity) 更新和对象时,数据库中的对象没有更新--- 我需要调用ISession.Flush 来更新它。

我如何更新对象的过程如下:

  1. 使用ISession.Get(typeof(T), id)从数据库中获取对象
  2. 更改对象属性,例如myCar.Color="Green"
  3. 使用ISession.Update(myCar) 将其提交回数据库

myCar 未更新到数据库。但是,如果我之后打电话给ISession.Flush,它就会被更新。

什么时候使用Flush,什么时候不使用?

【问题讨论】:

标签: nhibernate


【解决方案1】:

在许多情况下,您不必关心 NHibernate 何时刷新。

只有在创建自己的连接时才需要调用 flush,因为 NHibernate 不知道您何时提交。

对您来说真正重要的是交易。在事务期间,您与其他事务隔离,这意味着,当您从数据库中读取时,您始终可以看到您的更改,而您看不到其他更改(除非它们已提交)。因此,您不必关心 NHibernate 何时更新数据库中的数据,除非它已提交。无论如何,它对任何人都是不可见的。

NHibernate 刷新如果

  • 你调用 commit
  • 查询前确保您按内存中的实际状态进行过滤
  • 当你调用flush时

例子:

using (session = factory.CreateSession())
using (session.BeginTransaction())
{
  var entity = session.Get<Entity>(2);
  entity.Name = "new name";

  // there is no update. NHibernate flushes the changes.

  session.Transaction.Commit();
  session.Close();
}

实体在提交时更新。 NHibernate 看到您的会话是脏的并将更改刷新到数据库。仅当您在会话之外进行更改时才需要更新和保存。 (这意味着使用分离的实体,即会话不知道的实体)。


性能注意事项: Flush 不仅执行更新数据库所需的 SQL 语句。它还搜索内存中的变化。由于 POCO 上没有脏标志,因此它需要将会话中每个对象的每个属性与其一级缓存进行比较。如果过于频繁,这可能会成为性能问题。您可以采取一些措施来避免性能问题:

  • 不要循环冲洗
  • 避免序列化对象(需要序列化以检查更改)
  • 适当时使用read-only entities
  • 适当时设置mutable = false
  • 在属性中使用自定义类型时,实现高效的 Equals 方法
  • 当您确定自己知道自己在做什么时,请小心禁用自动刷新。

【讨论】:

  • 谢谢,但是当我更新数据库中的对象时,这是否意味着我创建了自己的事务?不然为什么要调用flush来更新数据库?
  • 必须修复它:您需要在创建自己的连接时刷新。如果您调用 CreateSession,NHibernate 会为您创建一个连接,但您可以提供您自己的 ADO.NET 连接。通常你不需要这个。如果你不这样做,你就不需要调用flush。
【解决方案2】:

NHibernate 只会在必要时执行 SQL 语句。它会尽可能地推迟 SQL 语句的执行。

例如,当您保存具有分配 id 的实体时,它可能会推迟 INSERT 语句的执行。 但是,当您插入一个具有自动递增 id 的实体时,NHibernate 需要直接插入该实体,因为它必须知道将分配给该实体的 id。

当您显式调用 flush 时,NHibernate 将执行该会话中已更改/创建/删除的对象所需的 SQL 语句。

Flush

【讨论】:

  • 提供的链接无效。它说“Knol 上不再提供此内容。”
  • @N30:我刚刚修复了链接。
猜你喜欢
  • 2012-12-15
  • 1970-01-01
  • 2010-09-07
  • 2011-08-06
  • 1970-01-01
  • 2010-11-19
  • 2014-07-02
相关资源
最近更新 更多