我有一个包含表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>

序列映射:

<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>

非常感谢任何帮助......

有帮助吗?

解决方案

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

然而,你可以使它工作,但它不漂亮。我将告诉你如何提供一些替代方案:

在您的交易hbml:

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

在你的序列html中:

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

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

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

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

我建议:

  1. 有两个多对一的关联。
  2. 在另一端与集合建立多对一关联。
  3. 从长远来看,这将为您省去很多麻烦。

其他提示

事实证明,对于我的情况,<join table>映射效果最好。我只需要确保我使第二个表中的属性是可以为空的类型,或者即使没有任何更改,它也会在保存时进行插入。由于我不需要延迟加载第二个表,这很好用。我确信我可以配对多对一映射工作,但它不直观,看起来比连接表选项更复杂,但<=>仅在NHibernate 2.0及更高版本中可用。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top