【问题标题】:NHibernate Saving a Collection via a StatelessSessionNHibernate 通过 StatelessSession 保存集合
【发布时间】:2011-12-04 15:33:45
【问题描述】:

我有 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 时都会保存区域的所有其他属性。

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

【问题讨论】:

  • 您是否尝试通过 StatelessSession 而不是整个 List 保存每个对象?
  • 我已经保存了区域和车辆。我需要某种方式来保存列表。调用 session.Insert(veh.Zones) 不起作用。调用 session.Insert(veh.Zones.Zone) 只会重新保存区域,对吗?有没有办法保存收藏?

标签: nhibernate stateless-session


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2011-05-15
    • 1970-01-01
    • 1970-01-01
    • 2019-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-20
    • 1970-01-01
    相关资源
    最近更新 更多