Однозначное сопоставление NHibernate, где данные второй таблицы могут быть нулевыми

У меня есть существующая база данных с таблицей Транзакции в ней. Я добавил новую таблицу TransactionSequence, в которой каждая транзакция в конечном итоге будет иметь только одну запись. Мы используем таблицу последовательности для подсчета транзакций для данной учетной записи. Я сопоставил это как однозначное сопоставление, в котором TransactionSequence имеет первичный ключ TransactionId.

Ограничение состоит в том, что в таблице транзакций есть триггер, который не позволяет обновлять отмененные или опубликованные транзакции.

Итак, когда последовательность вычислена и транзакция сохранена, NHibernate пытается отправить обновление транзакции, например «UPDATE Transaction SET TransactionId =? ГДЕ TransactionId =? '. Но это не удается из-за триггера. Как я могу настроить отображение так, чтобы NHibernate не пытался обновить таблицу транзакций при вставке новой таблицы TransactionSequence?

Отображение транзакции:

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

Любая помощь будет принята с благодарностью ...


person SteveBering    schedule 28.10.2008    source источник


Ответы (2)


Сопоставление один-к-одному в nhibernate не работает так, как вы думаете. Он разработан таким образом, что у вас есть два класса, которые при сохранении в соответствующих таблицах имеют одинаковые первичные ключи.

Однако вы можете заставить его работать, но это некрасиво. Я покажу вам, как тогда предложить несколько альтернатив:

В вашем HTML-коде транзакции:

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

В вашей последовательности html:

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

Это должно делать то, что вы хотите. Обратите внимание на свойство-ref.

Следующий вопрос, который вы собираетесь задать, - это то, как вы получаете ленивую загрузку индивидуальных ассоциаций. Ответ: вы не можете ... ну, можете, но, вероятно, это не сработает. Проблема в том, что у вас есть внешний ключ в таблице последовательности, а это означает, что nhibernate должен обратиться к базе данных, чтобы увидеть, существует ли цель. Затем вы можете попробовать поиграть с constrained = "true / false", чтобы увидеть, сможете ли вы убедить его лениво загрузить однозначную ассоциацию.

В общем, это приведет к потере вашего времени.

Я предлагаю либо:

  1. Создайте две ассоциации типа "многие к одному".
  2. Установите связь "многие к одному" с коллекцией на другом конце.

Это избавит вас от многих головных болей в долгосрочной перспективе.

person jonnii    schedule 28.10.2008
comment
У вас есть пример использования 2 many-to-one ассоциаций? Потому что одному из них необходимо использовать внешний ключ другой таблицы. - person Răzvan Flavius Panda; 04.07.2015

Оказывается, в моей ситуации отображение <join table> сработало лучше всего. Мне просто нужно было убедиться, что свойства, полученные из второй таблицы, являются типами, допускающими значение NULL, или он будет выполнять вставку при сохранении, даже если ничего не изменилось. Поскольку мне не нужна ленивая загрузка для второй таблицы, это отлично работает. Я уверен, что я мог бы заставить работать парные сопоставления «многие-к-одному», но это было не интуитивно понятно и кажется более сложным, чем опция таблицы соединений, однако <join table> доступна только в NHibernate 2.0 и выше.

person SteveBering    schedule 29.10.2008