NHibernate通过StatelessSession保存集合

时间:2011-10-10 15:48:43

标签: nhibernate stateless-session

我有两个类,它们在类中映射了多对多的集合。

这是我的两个类的简化映射:

车辆:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  <class xmlns="urn:nhibernate-mapping-2.2" name="EMTRAC.Devices.Device, EMTRAC_v3, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" table="`Device`">
    <id name="PK" type="System.Int64, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
      <column name="PK" />
      <generator class="identity" />
    </id>
    <version name="LastModifiedOn" column="LastModifiedOn" type="timestamp" access="field.pascalcase-underscore" />
    <joined-subclass name="EMTRAC.Vehicles.Vehicle, EMTRAC_v3, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null">
      <key>
        <column name="Device_id" />
      </key>      
      <component name="Zones" access="property">
        <bag name="_list" cascade="save-update" access="field" table="VehicleZones" inverse="true">
          <key>
            <column name="veh_id" not-null="true"/>
          </key>
          <many-to-many class="EMTRAC.Zones.Zone, EMTRAC_v3, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
        </bag>
      </component>
      <property name="ID" type="System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
        <column name="ID" />
      </property>     
  </class>
</hibernate-mapping>

区域:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  <class xmlns="urn:nhibernate-mapping-2.2" name="EMTRAC.Zones.Zone, EMTRAC_v3, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" table="`Zone`">
    <id name="ID" type="System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
      <column name="PK"/>
      <generator class="identity" />
    </id>
    <version name="LastModifiedOn" column="LastModifiedOn" type="timestamp" access="field.pascalcase-underscore" />
    <property name="ID" type="System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
      <column name="ID" />
    </property>
    <component name="Vehicles" access="property">
      <bag name="_list" cascade="save-update" access="field" table="VehicleZones">
        <key>
          <column name="veh_id" not-null="true"/>
        </key>
        <many-to-many class="EMTRAC.Vehicles.Vehicle, EMTRAC_v3, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
      </bag>
    </component>
  </class>
</hibernate-mapping>

在我的程序中,我有9600个区域和5000个车辆用于我对系统的压力测试。每个区域当前都映射到每个车辆,反之亦然,以模仿现实世界中的“更糟糕”场景。

我需要将此压力测试数据保存到数据库中,并且我遇到了几个问题,因为映射这两个列表的表在说完和完成时将包含4800万行。在现实世界中,一次性保存所有物品的可能性非常小,但仍会发生。因此,我需要能够确保在任何给定时间都可以保存这么多项目,即使我知道这将花费大量时间。

我知道对于批处理,建议使用无状态会话。但是,我已经读过无状态会话完全忽略级联更新,继承和集合。由于在提交调用期间收到堆栈溢出异常,因此目前无法使用无状态会话保存项目。

我的问题是这个。如果我先保存所有区域和车辆,那么对象将保留在数据库中。是否可以通过无状态会话保存列表,如果是这样,我将如何这样做?如果没有,还有其他建议吗?我使用StatelessSession尝试的所有内容都没有导致Collection异常的持久性。

修改的 我一直在跟踪使用常规会话保存这些对象。如果我将保存分解为在不同的会话和事务中保存每100个,则每次我在车辆上调用SaveOrUpdate时,它都会保存区域的所有其他属性。

有没有办法让它只保存列表而不是触摸车辆或区域对象本身?这似乎是我最后一件工作所需要的。

1 个答案:

答案 0 :(得分:1)

无状态会话不会级联,因此无法保存集合,即使实体已经插入也是如此。你必须诉诸会议。我在Etl工作中经常使用它,在处理大量实体时,我在批量生成100 - 500个实体后调用Flush()Clear()并且速度不是问题。