NHibernate一对一映射,其中第二个表数据可以为null

Ste*_*ing 11 nhibernate one-to-one

我有一个现有的数据库,里面有表Transactions.我添加了一个名为TransactionSequence的新表,其中每个事务最终只有一个记录.我们使用序列表来计算给定帐户的交易.我已将其映射为一对一映射,其中TransactionSequence具有TransactionId的主键.

约束是事务表上有一个而不是触发器,不允许更新已取消或已发布的事务.

因此,当计算序列并保存事务时,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>
Run Code Online (Sandbox Code Playgroud)

和序列映射:

<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>
Run Code Online (Sandbox Code Playgroud)

任何帮助将不胜感激...

jon*_*nii 15

nhibernate中的一对一映射不会像您认为的那样工作.它的设计使你有两个类,当它们持久化到相应的表时,它们具有相同的主键.

但是你可以让它工作,但它并不漂亮.我将告诉你如何提供一些替代方案:

在您的Transaction hbml中:

<one-to-one name="Sequence" class="TransactionSequence" property-ref="Transaction"/>
Run Code Online (Sandbox Code Playgroud)

在你的序列html中:

<many-to-one name="Transaction" class="Transaction" column="fk_Transaction_Sequence" />
Run Code Online (Sandbox Code Playgroud)

应该做你想做的事.注意property-ref.

您要发布的下一个问题是询问您如何在一对一关联上进行延迟加载.答案是,你不能......你可以,但它可能无法奏效.问题是您在序列表上有外键,这意味着nhibernate必须访问数据库以查看目标是否存在.然后你可以尝试使用约束="真/假"来看看你是否可以说服懒惰地加载一对一的关联.

总而言之,这会浪费你的时间.

我建议:

  1. 有两个多对一的关联.
  2. 在另一端与集合建立多对一关联.

从长远来看,这将为您省去很多麻烦.