我有 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 时都会保存区域的所有其他属性。
有没有办法让它只保存列表而不接触车辆或区域对象本身?这似乎是我需要让最后一块工作。