簡體   English   中英

在Nhibernate中使用外鍵關系映射復合主鍵

[英]Mapping a composite primary key with a foreign key relation in Nhibernate

我正在工作的一家公司正在使用ERP,它的舊數據庫是Oracle。 到目前為止,我已經使用了包(oracle存儲過程)來訪問數據,但是在這些年里,數字一直在增長,現在我再也無法管理它們了。
我試圖用Nhibernate做一些實驗,並開始映射一些表。
所有表都具有復合主鍵。 簡要說明:

表順序(表名: OCSAORH

OCHORDN( PK )=>訂單號
OCHAMND( PK
OCHCOSC( PK )=>公司
OCHCLII
...

表OrderLine(表名稱: OCSALIN

OCLORDN( PK )=> OrderNumber
OCLAMND( PK
OCLCOSC( PK )=>公司
OCLLINN( PK )=>行號
OCLSSEQ( PK
OCLITMN
...

這是我的地圖

訂單

<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   assembly="MvcOracleNhibernate"
                   namespace="MvcOracleNhibernate.Domain">
  <class name="Order" table="OCSAORH">
    <composite-id>
      <key-property name="Number" column="OCHORDN"></key-property>
      <key-property name="Ver" column="OCHAMND"></key-property>
      <key-property name="Company" column="OCHCOSC"></key-property>
    </composite-id>
    <property name="CustomerCode" column="OCHCLII" type="String" length="10"></property>
    <property name="Reference" column="OCHOCNO" type="String" length="25"></property>
    <property name="Date" column="OCHOCDT" type="Double"></property>
    <bag name="OrderLines" cascade="all-delete-orphan" generic="true" inverse="true" lazy="false">
      <key>
        <column name="OCLORDN" not-null="true"/>
        <column name="OCLAMND" not-null="true"/>
        <column name="OCLCOSC" not-null="true"/>
      </key>
      <one-to-many class="OrderLine" not-found="ignore"/>
    </bag>
  </class>
</hibernate-mapping>

OrderLine

<?xml version="1.0" encoding="utf-8"?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   assembly="MvcOracleNhibernate"
                   namespace="MvcOracleNhibernate.Domain">
  <class name="OrderLine" table="OCSALIN">
    <composite-id>
      <key-property name="Number" column="OCLORDN"></key-property>
      <key-property name="Ver" column="OCLAMND" ></key-property>
      <key-property name="Company" column="OCLCOSC"></key-property>
      <key-property name="Line" column="OCLLINN"></key-property>
      <key-property name="Seq" column="OCLSSEQ"></key-property>
    </composite-id>
    <property name="Item" column="OCLITMN" type="String" length="19"></property>
    <property name="Quantity" column="OCLQTYP" type="Double"></property>
  </class>
</hibernate-mapping>

有了這些映射,一切正常; 我可以加載訂單,而延遲加載則可以加載行。 在閱讀一些文檔時,我注意到我沒有定義多對一關系,所以我添加了這個:

<many-to-one name="Order" class="Order" lazy="proxy">
  <column name="OCHORDN" not-null="true"/>
  <column name="OCHAMND" not-null="true"/>
  <column name="OCHCOSC" not-null="true"/>
</many-to-one>   

到OrderLine映射文件。
現在,如果我運行我的測試應用程序,訂單已正確加載,但訂單行未加載。
我得到了{NHibernate.ADOException} = {“無法初始化集合:...}我試圖進行調查,發現生成的用於檢索行的查詢是錯誤的。這是SQL:

SELECT 
    orderlines0_.OCLORDN as OCLORDN1_, 
    orderlines0_.OCLAMND as OCLAMND1_, 
    orderlines0_.OCLCOSC as OCLCOSC1_, 
    orderlines0_.OCLLINN as OCLLINN1_, 
    orderlines0_.OCLSSEQ as OCLSSEQ1_, 
    orderlines0_.OCLORDN as OCLORDN13_0_, 
    orderlines0_.OCLAMND as OCLAMND13_0_, 
    orderlines0_.OCLCOSC as OCLCOSC13_0_, 
    orderlines0_.OCLLINN as OCLLINN13_0_, 
    orderlines0_.OCLSSEQ as OCLSSEQ13_0_, 
    orderlines0_.OCLITMN as OCLITMN13_0_, 
    orderlines0_.OCLQTYP as OCLQTYP13_0_, 
    orderlines0_.OCHORDN as OCHORDN13_0_, 
    orderlines0_.OCHAMND as OCHAMND13_0_, 
    orderlines0_.OCHCOSC as OCHCOSC13_0_ 
FROM OCSALIN orderlines0_ 
WHERE 
    orderlines0_.OCLORDN=? 
    and orderlines0_.OCLAMND=? 
    and orderlines0_.OCLCOSC=?

您可以注意到select的最后3個字段(具有前綴OCH而不是OCL的字段)不是OCSALIN表的成員; 它們是OCSAORH的關鍵。
閱讀文檔和示例1天后,我無法弄清楚我做錯了什么。
那里有人可以嘗試幫忙嗎?

這是預期的行為。 您正在多對一映射中定義外鍵。 因此列需要存在於您定義的對象中。

我想你想要這個

<many-to-one name="Order" class="Order" lazy="proxy">
  <column name="OCLORDN" not-null="true"/>
  <column name="OCLAMND" not-null="true"/>
  <column name="OCLCOSC" not-null="true"/>
</many-to-one>   

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM