0

我在信封和交易之间有一对一的关系。我使用主键关联映射它,如下所示:

<class name="Envelope" table="T_ENVELOPE">
    <id name="EnvelopeId" column="ENVELOPE_ID"><generator class="identity"/></id>
    <one-to-one class="Transaction" cascade="all" name="Transaction" />
</class>
<class name="Transaction" table="T_TRANSACTION">
    <id name="TransactionID" column="TRANSACTION_ID" type="long"><generator class="foreign"><param name="property">Envelope</param></generator></id>
    <one-to-one name="Envelope" class="Envelope" constrained="true" />
</class>

这很好用,但我的情况很复杂,因为T_TRANSACTION有 2 个 FK 都映射到T_ENVELOPE's PK (ENVELOPE_ID): TRANSACTION_ID(如上所示)和OLD_DEPRECATED_TXN_ID. 所以,我有 2 个 FKT_ENVELOPE具有完全相同的值(信封的 id)。我怎样才能让 NHibernateENVELOPE_ID不仅保存在其中,TRANSACTION_ID而且还保存在其中OLD_DEPRECATED_TXN_ID

我希望我没有这个要求,但我正在处理遗留代码模式和代码。我知道我也可以做类似的事情:

  1. envelope.Save // 这会保存 Envelope 和 Transaction 的事务 ID,但不保存 OLD_DEPRECATED_TXN_ID
  2. 信封.transaction.old_deprecated_txn_id = 信封.id
  3. 信封.Save 但是,这会导致一次插入和一次更新。我如何只做一个插入?

这是一个例子:

T_ENVELOPE
----------
ENVELOPE_ID
1
9
121

T_TRANSACTION
-------------
TRANSACTION_ID | OLD_DEPRECATED_TXN_ID
1|1
9|9
121|121
4

1 回答 1

0

根据您的要求,您可以:

  1. 编写一个存储过程来执行插入并配置 NHibernate 以在映射中使用此过程。在处理未使用但必须填充的遗留数据库和历史字段时,我采用了这种方法

  2. 使用拦截器。以下内容应该可以工作。虽然没有测试!

    public class TransactionEntityInterceptor : EmptyInterceptor
    {
    
    
      public override boolean OnSave(object entity,
                      object id,
                      object[] state,
                      string[] propertyNames,
                      IType[] types)
      {
          if (entity is Transaction)
          {
              Object TransactionID;
              for ( int i=0; i<propertyNames.Length; i++ )
              {
                  if ( "TransactionID" == propertyNames[i] )
                  {
                      TransactionID = state[i];
                      return true
                  }
              }
    
              for ( int i=0; i<propertyNames.Length; i++ )
              {
                  if ( "OLD_DEPRECATED_TXN_ID" == propertyNames[i] )
                  {
                      state[i] = TransactionID;
                      return true;
                  }
              }
              return false;
          }
          else
          {
              return true;
          }
      }
    } 
    
于 2013-04-20T10:21:10.777 回答