2009-11-17 45 views
3

我有一個現有的POCO類庫,其中子集合都存儲在數組中。例如,客戶類有發票[]數組來保存它的發票:如果表中沒有索引,如何配置NHibernate映射到數組?

class Customer 
{ 
    public int ID; 
    public Invoice[] _invoices; 
} 

class Invoice 
{ 
    public int ID; 
    public int CustomerID; 
    public string SomeData; 
} 

我不能改變那些類,我想將它們映射到使用NHibernate現有的數據庫。

我看了<array>映射,但它似乎需要一個<index>元素。在我的數據庫中,[Invoice]表沒有索引列。當客戶的發票被加載時,我不指望他們在陣列中的任何特定位置。

我有什麼選擇?

回答

2

不幸的是,你的選擇是改變你的班級或你的表格。

A)您可以更改Customer來聲明發票爲IList而不是數組;你將能夠將它們映射爲unsorted bag。你甚至可以使它按一些列排序:

<bag name="Invoices" table="Invoices" order-by="ID ASC"> <!-- order-by is optional --> 
    <key column="CustomerID"/> 
    <element column="SomeData" type="String"/> 
    <!-- or use one-to-many if Invoice is mapped as entity --> 
    <one-to-many class="Whatever.Invoice, Whatever"/> 
</bag> 

B)。你可以改變你的表包含索引列和發票映射爲真實<array>

<array name="Invoices" table="Invoices" order-by="ID ASC"> <!-- order-by is optional --> 
    <key column="CustomerID"/> 
    <index column="IndexNr"/> 
    <element column="SomeData" type="String"/> 
</array> 
+0

@ ChssPly76:這是一個非常大的項目,所以我願意投入相當多的時間來做到這一點不改變類和數據庫。如果我願意擴展NHibernate並提供自己的Array映射實現,該怎麼辦?這很簡單(我對NHibernate完全陌生,所以我不知道涉及到什麼)?我可以繼承默認的數組映射嗎?只能在運行和內存中生成順序索引值?也許我應該在NH郵件列表上討論這個問題...... – Sylvain 2009-11-17 04:07:28

+1

你當然可以實現你自己的集合類型;你需要實現'IUserCollectionType'來完成,並通過映射中的'collection-type'屬性引用你的類名。這裏是關於這個主題的文章:http://www.javalobby.org/java/forums/m91832311.html;它處理Hibernate/java,但幾乎所有東西都應該直接移植到NHibernate中。 – ChssPly76 2009-11-17 04:23:02

+0

@ ChssPly76:感謝您的指點。我檢查了'IUserCollectionType','ArrayType'和'PersistentArrayHolder'類。看起來好像我可以在沒有太多困難的情況下繼承'ArrayType'。 – Sylvain 2009-11-17 04:47:26