2011-10-10 61 views
2

我有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時,都會保存該區域的所有其他屬性。

有什麼辦法讓它只保存列表,而不是自己觸摸車輛或區域對象?這似乎是我需要得到這最後一塊工作。

+0

你是否嘗試保存每個對象通過StatelessSession而不是整個列表? –

+0

我已經保存了區域和車輛。我需要一些方法來保存列表。調用session.Insert(veh.Zones)不起作用。調用session.Insert(veh.Zones.Zone)只會重新保存區域,對吧?沒有辦法保存收藏? –

回答

1

無狀態會話不會級聯,因此無法保存集合,即使實體已插入。你必須訴諸會議。我在Etl工作中使用了很多,在處理大量實體時,我在批量處理100-500個實體後調用了Flush()Clear(),並且速度沒有問題。

相關問題