代码之家  ›  专栏  ›  技术社区  ›  Richard Bramley

对具有一对多关系的对象使用版本乐观锁定时,NHibernate StaleObjectStateException

  •  0
  • Richard Bramley  · 技术社区  · 17 年前

    我正在使用NHibernate和ASP。Net按照Billy McCafferty在最佳实践文章中的建议,使用每个请求的会话(抱歉,我不能包含链接)。我已经成功地将其用于版本乐观锁定,将更新的对象保存在HTTP会话对象中,并使用SaveOrUpdate方法重新连接到NHibernate会话。

    但是,我的最新页面需要更新子对象的集合。我使用了NHibernate手册(第17章)亲子示例中建议的方法。当在单个请求中加载和保存时,该功能就可以工作。然而,当加载到一个请求中,保存在HTTP会话中,并使用SaveOrUpdate在后续请求中重新连接时,我在刷新NHibernate会话时会遇到StaleObjectException。即使未对子对象集合进行任何更改,也会发生这种情况。

    对父对象属性所做的更改将保存到数据库中,因此NHibernate似乎正在尝试两次更新该对象。我怀疑这与映射中的级联选项有关,但为了使父/子关系正常工作,这些选项是必需的。

    以下是我的映射文件:

    父类映射

    <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
      <class name="NHS.WebTeam.PharmacyFirst.Medication, PharmacyFirst" table="Medication" lazy="false" optimistic-lock="version" where="Deleted=0">
        <id name="ID" column="Medication_ID" unsaved-value="0">
          <generator class="identity" />
        </id>
    
        <version column="version" name="Version"/>
        <property name="Deleted" column="Deleted" />
    
        <property name="Name" column="Name" />
    
        <bag name="Prices" access="field.camelcase-underscore" lazy="false" inverse="true" cascade="all">
          <key column="Medication_ID"/>
          <one-to-many class="NHS.WebTeam.PharmacyFirst.MedicationPrice, PharmacyFirst" />
        </bag>
    
      </class>
    </hibernate-mapping>
    

    子类映射

    <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
      <class name="NHS.WebTeam.PharmacyFirst.MedicationPrice, PharmacyFirst" table="Medication_Price" lazy="false" optimistic-lock="version" where="Deleted=0">
        <id name="ID" column="Medication_ID" unsaved-value="0">
          <generator class="identity" />
        </id>
    
        <many-to-one name="Medication" column="medication_id" not-null="true" cascade="none"/>
        <property name="DateFrom" column="Date_From" />
        <property name="Price" column="Price" />
    
      </class>
    </hibernate-mapping>
    

    有人能帮忙吗。

    1 回复  |  直到 17 年前
        1
  •  0
  •   Chris Chilvers    16 年前

    对于其他发现这个问题的人来说,这个问题似乎已经在nhibernate 2.1中得到了修复,所以你应该更新一下。

    推荐文章