2

我有 2 个类,它们在类中映射了彼此的多​​对多集合。

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

车辆:

<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 次保存,那么每次我在 Vehicle 上调用 SaveOrUpdate 时都会保存区域的所有其他属性。

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

4

1 回答 1

1

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

于 2011-10-11T14:54:48.147 回答