代码之家  ›  专栏  ›  技术社区  ›  Sebastian Edelmeier

从nhibernate会话获取更改的实体

  •  2
  • Sebastian Edelmeier  · 技术社区  · 14 年前

    我想知道是否有一种平稳的方法来跟踪使用NHibernate的变更实体。

    session.isdirty()是一种很好的方法,可以知道有变化,但不能知道是哪一种。到目前为止,我已经将我的更改记录在一个列表中,以便以后能够指定它们。最后,我将遍历该列表,并对每个列表调用session.save(),然后从列表中删除该项。

    我有办法避开这个吗?

    提前多谢了

    塞比

    1 回复  |  直到 14 年前
        1
  •  0
  •   David M    14 年前

    听起来你在努力解决问题,你的会话寿命是错误的。会话设计用于单个工作单元。您不应该用这种方式清除会话来继续使用它,而是应该刷新它并重新开始使用新的会话。如果您正使用它来加速由于缓存而导致的应用程序,我建议您查看nhibernate中的二级缓存,它在 SessionFactory 而不是 Session 水平。

    如果您有一个长时间运行的编辑过程,并且在结束时进行了大量的批处理保存,那么在我的视图中,您应该处理断开连接的对象。因此,您可以使用一个会话来加载对象及其任何相关对象,在会话上下文之外使用它们进行编辑,然后在过程结束时,使用 SaveOrUpdate 然后刷新该会话。如果您正在为并发性方法使用离线otimistic锁,例如使用SQL Server,那么这种方法最有效。 timestamp 列或Oracle ORA_SCN 虚拟列作为您的版本。如果您下面的对象发生了更改,则更新将失败,并返回 StaleObjectStateException .

    但是YMMV,我需要更多的了解你的申请,才能说出比这更具体的内容。