我们正在尝试在抛出StaleObjectStateException之后组合对象以保存合并副本。
这是我们的环境状况:
用例:
我们希望正常处理异常。 由于用户共享父级的所有权,因此用户1应该能够成功保存,并使用他的新孩子和用户2的孩子保存父级。
根据艾恩德(http://msdn.microsoft.com/en-us/magazine/ee819139.aspx)的说法,当SOSE被抛出时:
你的会话及其加载的实体都是toast,因为使用NHibernate时会抛出一个异常 从会话中将该会话移动到未定义的状态。您无法再使用该会话 或任何加载的实体
已经为现在没有用的会话分配了一个ID和版本#。 (我希望它没有。)
我们如何结合使用ISession.Merge()和ISession.Refresh()来获得同时具有C1和C2的新保存的父类?
我们已经尝试了许多奥术排列,但都没有完全奏效。 通常,“行已被另一个事务更新或删除(或未保存的值映射不正确”)或ODBC级别的实际ID冲突。
我们的理论,目前:
但是,所有文档都表明newSession.Merge 假设就足够了。
用作研究的其他帖子:
Fluent NHibernate Newbie: Row was updated or deleted by another transaction
Is there an alternative to ISession.Merge() that doesn't throw when using optimistic locking?
StaleObjectstateException row was updated or deleted by
How I can tell NHibernate to save only changed properties
Hibernate (JPA): how to handle StaleObjectStateException when several object has been modified and commited(java,但相关,我认为)
答案 0 :(得分:2)
由于用户共享父母的所有权,因此用户1应该能够成功保存,并使用他的新孩子和用户2的孩子保存父母。
为什么不在子集合上禁用乐观锁定?然后任何人都可以添加子项,它不会增加父项的版本。
否则,这是我当前项目用于会话可能抛出的所有可恢复异常的解决方案(例如,连接到DB丢失,外键违反,......):
session.Flush()
之前,会话被序列化为MemoryStream
。session.Flush()
或transaction.Commit()
抛出可恢复的异常,则会丢弃原始会话并对已保存的会话进行反序列化。