2008-10-28 24 views
11

我有一個現有的數據庫中的表事務。我添加了一個名爲TransactionSequence的新表,其中每個事務最終只有一條記錄。我們使用序列表來計算給定帳戶的交易。我已將其映射爲TransactionSequence具有TransactionId主鍵的一對一映射。NHibernate一對一的映射,其中第二個表的數據可以爲空

約束條件是在事務表上有一個而不是觸發器,不允許更新已取消或已提交的事務。因此,當序列被計算並且事務被保存時,NHibernate會嘗試發送一個事務更新,如'UPDATE Transaction SET TransactionId =? Where TransactionId =?'。但是由於觸發器而失敗。如何配置我的映射,以便在插入新的TransactionSequence表時NHibernate不會嘗試更新Transaction表?

交易映射:

<class name="Transaction" table="Transaction" dynamic-update="true" select-before-update="true"> 
    <id name="Id" column="ID"> 
     <generator class="native" /> 
    </id> 

    <property name="TransactionTypeId" access="field.camelcase-underscore" /> 
    <property name="TransactionStatusId" column="DebitDebitStatus" access="field.camelcase-underscore" /> 

    <one-to-one name="Sequence" class="TransactionSequence" fetch="join" 
       lazy="false" constrained="false">  
    </one-to-one> 
</class> 

和序列映射:在NHibernate的

<class name="TransactionSequence" table="TransactionSequence" dynamic-update="true"> 
    <id name="TransactionId" column="TransactionID" type="Int32"> 
     <generator class="foreign"> 
      <param name="property">Transaction</param> 
     </generator> 
    </id> 

    <version name="Version" column="Version" unsaved-value="-1" access="field.camelcase-underscore" /> 

    <property name="SequenceNumber" not-null="true" /> 

    <one-to-one name="Transaction" 
       class="Transaction" 
       constrained="true" 
       foreign-key="fk_Transaction_Sequence" /> 

</class> 

任何幫助將不勝感激......

回答

15

一對一的映射不起作用你認爲它的確如此。它的設計目的是讓你有兩個類,當它們被保存到相應的表中時,它們具有相同的主鍵。

然而,你可以使它工作,但它不漂亮。我會告訴你如何再提供一些替代方案:你希望它是什麼

<many-to-one name="Transaction" class="Transaction" column="fk_Transaction_Sequence" /> 

應該做:

在您的交易hbml:

<one-to-one name="Sequence" class="TransactionSequence" property-ref="Transaction"/> 

在你的HTML序列做。注意屬性參考。

你要發佈的下一個問題是要問你如何獲得一對一關聯的延遲加載。答案是,你不能...你可以,但它可能不會工作。問題是你在序列表上有你的外鍵,這意味着nhibernate必須命中數據庫才能看到目標是否存在。然後你可以試着用constrained =「true/false」來玩,看看你是否可以說服它懶惰地加載一對一的關聯。

總而言之,這會導致您的時間浪費。

我建議要麼:

  1. 有兩個many-to-one關聯。
  2. 與另一端的集合具有多對一的關聯。

從長遠來看,這將爲您節省大量的麻煩。

+0

你有沒有關於如何使用2`多對一'關聯的例子?導致其中一個需要使用另一個表的外鍵。 – 2015-07-04 20:17:52

2

原來,我的情況<join table>映射效果最好。我只需要確保我使得來自第二個表的屬性爲可空類型,或者即使沒有任何更改,它也會在保存時執行插入操作。由於我不需要第二個表的延遲加載,所以這很好。我確信我可以配對多對一的映射來工作,但它並不直觀,似乎比連接表選項更復雜,但<join table>僅在NHibernate 2.0及更高版本中可用。

相關問題