我有一个包含许多软件包和存储过程的旧版Oracle数据库。我想映射到一些表并使用一些存储过程。我正试图找到一种方法,我不必映射到存储过程使用的每个表。
举一个具体的例子,说我有以下表格:
Customer
--------
ID
Name
Transaction
-----------
FromCustomerID
ToCustomerID
AccountCode
Amount
Transaction表具有FromCustomerID,ToCustomerID和AccountCode的组合键。现在我有一个存储过程返回4个字段:FromCustomerID,FromCustomerName,ToCustomerID和AccountCode。
我将客户和交易映射为:
public class CustomerMap:ClassMap<Customer>
{
public CarePartyMap()
{
Table("Schema.Customer");
Id(x => x.Id)
.Column("customer_id")
.GeneratedBy.Assigned();
Map(x => x.Name, "Name");
}
}
public class TransactionsMap : ClassMap<Transactions>
{
public TransactionsMap ()
{
Table("Schema.Transactions");
CompositeId().KeyProperty(x => x.FromCustomer, "From_Customer_ID")
.KeyProperty(x => x.ToCustomer, "To_Customer_ID")
.KeyProperty(x => x.AccountCode, "Account_Code");
//blah blah
}
}
然后我尝试创建一个嵌入式hbm文件:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
assembly="MyApp.Domain"
namespace="MyApp.Domain.Something"
auto-import="true">
<sql-query name="MySP">
<query-param name="n_Customer_id" type="int"/>
<query-param name="n_location_id" type="int"/>
<return class="Transaction" alias="t">
<return-property column="Account_Code" name="AccountCode"/>
</return>
<return-join property="t.FromCustomer" alias="fc">
<return-property name="Id" column="From_Customer_id"/>
<return-property name="Name" column="From_Customer_Name"/>
</return-join>
<return-join property="t.ToCustomer" alias="tc">
<return-property name="Id" column="To_Customer_Id"/>
</return-join>
{ call MyPkg.MyProcedure(:n_Customer_id,:n_location_id) }
</sql-query>
</hibernate-mapping>
我无法使用此功能,因为Transactions中的ID是一个复合键,并且无法正确初始化Transaction实体。但是,我想知道的是如何在不映射到Transaction表的情况下执行这些映射。除了这个存储过程之外,我没有使用此映射。如果我必须映射到存储过程调用的每个表,这将是一项大量的工作。此外,是否有任何快捷方式可以使用存储过程调用的复合键映射某些内容?
谢谢,BillN