我有两个类,它们在类中映射了多对多的集合。
这是我的两个类的简化映射:
车辆:
<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时,它都会保存区域的所有其他属性。
有没有办法让它只保存列表而不是触摸车辆或区域对象本身?这似乎是我最后一件工作所需要的。
答案 0 :(得分:1)
无状态会话不会级联,因此无法保存集合,即使实体已经插入也是如此。你必须诉诸会议。我在Etl工作中经常使用它,在处理大量实体时,我在批量生成100 - 500个实体后调用Flush()
和Clear()
并且速度不是问题。