2009-11-17 42 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