0

Envelope と Transaction の間には 1 対 1 の関係があります。以下のように、主キーの関連付けを使用してマップしました。

<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しますが、 T_ENVELOPE's PK (ENVELOPE_ID): TRANSACTION_ID(上記のように) とOLD_DEPRECATED_TXN_ID. したがって、T_ENVELOPEまったく同じ値 (エンベロープの ID) を持つ 2 つの FK があります。NHibernate を保存するENVELOPE_IDだけでTRANSACTION_IDなく、保存する方法を教えOLD_DEPRECATED_TXN_IDてください。

この要件がなければよかったのですが、レガシー コード スキーマとコードを扱っています。次のようなこともできることを知っています:

  1. Envelope.Save // これにより、エンベロープとトランザクションのトランザクション ID が保存されますが、OLD_DEPRECATED_TXN_ID は保存されません
  2. エンベロープ.トランザクション.old_deprecated_txn_id =エンベロープ.id
  3. Envelope.Save しかし、それは 1 回の挿入と 1 回の更新という結果になります。1 回だけ挿入するにはどうすればよいですか?

次に例を示します。

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 を構成します。使用されていなかったが入力する必要があったレガシー DB と履歴フィールドを操作するときに、このアプローチを採用しました。

  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 に答える