如果无效,则将更改回滚到对象

时间:2010-06-09 09:36:50

标签: nhibernate

如何在nhibernate中回滚对附加对象的更改?我们在更新/保存之前进行了验证(示例简化)..

var setting = Get("key")
setting.Value = "helo" //for whatever reason, this particular 
                       //setting cannot have its value saved to the database
...
Verify(setting);       //throws
base.Update(setting);

但是由于附加了对象,所以在会话中已经发生了任何更改,即使验证将被抛出,也永远不会到达Update。处理这个问题的正确方法是什么?

1 个答案:

答案 0 :(得分:2)

这很可能是,因为周围的事务提交,即使抛出异常也是如此。或者您稍后捕获异常并隐藏周围事务中的错误。 每当刷新会话时,NH都可以执行更新,例如在执行查询之前。提交始终将内存状态与数据库同步。

只有尚未在会话中(但在数据库中)的实例才需要更新。会话中的所有内容都会同步到数据库,任何任何时间点,最迟在提交时。

NH的一个优点是所谓的“持久性无知”。这意味着,在将实例加载到内存后,您的逻辑不再关心持久性。你正在使用你的任何其他类,最后一切都将以原子方式持久化(或回滚)。

那么这对你的代码意味着什么呢?

  • 编写代码,就像没有NHibernate或持久性一样。这也将增强可维护性和可测试性。
  • 您在记忆中所做的事情是明确的。您没有第二个“商店”步骤。不要做你不想做的事情。
  • 您的内存需要与数据库一致。您的逻辑始终基于内存状态(例如,计算)。内存不一致会破坏应用程序的一致性。因此,当您在数据库中不需要内存中的数据时,不应该提交。
  • 提交全部或全无。要么你对你的改变感到满意,要么你回滚所有的东西。
  • 异常处理很棘手。决定是否可以继续进行交易并非易事。
  • 更改实体的状态是您的业务逻辑的责任。 NHibernate不会“重置”单个实例。 (有一个刷新,但它不会在这里工作,你不应该使用它)。因此,如果要重置值,则需要编写重置值的业务逻辑。