我有2個類有一個多對多的集合映射到類中的彼此。NHibernate通過一個StatelessSession保存一個集合
這是我的兩個類的簡化映射:
車輛:
<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萬行。在現實世界中,一次保存所有項目的可能性將非常小,但仍然會發生。因此,我需要能夠確保在任何特定時間都可以保存這些項目,儘管我知道這需要大量的時間。
我知道對於批處理,建議使用無狀態會話。但是,我已經讀過無狀態會話,完全忽略了級聯更新,繼承和集合。當我在提交調用期間收到堆棧溢出異常時,保存具有無狀態會話的項目目前是不可能的。
我的問題是這樣的。如果我先保存所有區域和車輛,則這些對象會保留在數據庫中。是否有可能通過無狀態會話保存列表,如果有的話,我該如何去做呢?如果沒有其他建議?我使用無狀態會話嘗試的所有內容都導致收集異常沒有持續存在。
編輯 我一直在追蹤使用常規會話保存這些對象。如果我在每次不同的會話和事務中將每次保存的儲存分解爲100次,則每次我在車輛上調用SaveOrUpdate時,都會保存該區域的所有其他屬性。
有什麼辦法讓它只保存列表,而不是自己觸摸車輛或區域對象?這似乎是我需要得到這最後一塊工作。
你是否嘗試保存每個對象通過StatelessSession而不是整個列表? –
我已經保存了區域和車輛。我需要一些方法來保存列表。調用session.Insert(veh.Zones)不起作用。調用session.Insert(veh.Zones.Zone)只會重新保存區域,對吧?沒有辦法保存收藏? –