代码之家  ›  专栏  ›  技术社区  ›  sh_kamalh

nhibernate isession.update

  •  3
  • sh_kamalh  · 技术社区  · 15 年前

    我注意到,通过使用log4net,当调用isession.update时,它会更新所有更改的对象。
    例如:

    
    // Change 2 instances 
    user1.IsDeleted = true;
    user2.UserName = "Xyz";
    // Call session.Update to update the 2 users
    using (ITransaction transaction = session.BeginTransaction())
    {
        Session.Update(user1); // This updates both user1 & user2
        transaction.Commit();
    }
    using (ITransaction transaction = session.BeginTransaction())
    {
        Session.Update(user2); // Now there is no need for this
        transaction.Commit();
    }
    

    这是nhibernate的默认行为还是与我的映射文件有关?
    我能一个接一个地更新NHIBERNATE吗?

    2 回复  |  直到 15 年前
        1
  •  12
  •   Community Mohan Dere    9 年前

    它是 normal default behavior :

    Hibernate维护对象缓存 已插入、更新或 删除。它还保存了 已从中查询的对象 数据库。这些物体是 被称为持久对象 只要那个实体经理 用于获取它们的函数仍处于活动状态。 这意味着 这些对象在 交易自动进行 当事务为 坚信的。这些更新是隐式的 在交易边界内 你不必打电话 保持值的任何方法。

    Hibernate Pitfalls part 2 :

    q)我还需要做保存和 是否更新内部交易记录?

    save()仅适用于 不持久(如新的 对象)。您可以使用更新 被收回的对象 参加会议。

    NHibernate's automatic (dirty checking) update behaviour :

    我刚发现如果我 来自nHibernate会话的对象和 更改对象的属性, NHibernate将自动更新 没有我提交的对象 正在调用session.update(myobj)!

    回答: 可以将session.flushmode设置为 FlushMode.从不。这将使你 操作显式ie:on tx.commit()或session.flush()。 当然,这仍然会更新 提交/刷新时的数据库。如果你愿意的话 不想这样做,然后打电话 驱逐(Yourobj),它将 然后变成短暂的氨气 不会为它发出任何db命令。

        2
  •  2
  •   ramin tarhandeh    15 年前

    当会话的FlushMode为Auto或Commit时,这是默认行为。

    在这些情况下,调用transaction.commit()将刷新会话并更新所有持久对象

    因此,如果删除calls会话。更新它不会有任何区别。

    我能一个接一个地更新NHIBERNATE吗?

    对。使用FlushMode。尽可能不要或推迟提交会话。我想你不需要用Evict来处理这个案子