NHibernate一对一映射,其中第二个表数据可以为null
-
05-07-2019 - |
题
我有一个包含表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;看看你是否可以说服懒惰加载一对一的关联。
总而言之,这会浪费你的时间。
我建议:
- 有两个多对一的关联。
- 在另一端与集合建立多对一关联。 醇>
从长远来看,这将为您省去很多麻烦。
其他提示
事实证明,对于我的情况,<join table>
映射效果最好。我只需要确保我使第二个表中的属性是可以为空的类型,或者即使没有任何更改,它也会在保存时进行插入。由于我不需要延迟加载第二个表,这很好用。我确信我可以配对多对一映射工作,但它不直观,看起来比连接表选项更复杂,但<=>仅在NHibernate 2.0及更高版本中可用。