Изменение части составного идентификатора - PullRequest
0 голосов
/ 08 октября 2010

У меня есть класс BillMedicine, который является таблицей «многие ко многим» для Билла и Медицины. Файл сопоставления BillMedicine:

<class name="BillMedicine" table="Bill_Medicine">
    <composite-id>
        <key-many-to-one name="Bill" class="Bill" column="BillID" />
        <key-many-to-one name="Medicine" class="Medicine" column="MedicineID" />
    </composite-id>
    <version name="LastModifiedOn" column="LastModifiedOn" type="DateTime" 
             access="field.pascalcase-underscore" />
    <property name="Quantity" column="QuantityPurchased" />
</class>

Когда я создаю новый BillMedicine и обновляю количество, мой модульный тест проходит успешно. Однако, если я раскомментирую строку, обновляющую лекарство, я получу исключение NHibernate.StaleObjectStateException: Row was updated or deleted by another transaction

BillMedicineRepository target = new BillMedicineRepository();
BillMedicine billMedicine =
    new BillMedicine { Bill = _bill, Medicine = _medicine1, Quantity = 1 };
target.AddBillMedicine(billMedicine);

//billMedicine.Medicine = _medicine2;
billMedicine.Quantity = 2;
target.UpdateBillMedicine(billMedicine); // Exception if I update the medicine

Я проверил SQL, показанный NHibernate, и он не обновляет лекарство

UPDATE Bill_Medicine SET LastModifiedOn = @p0, QuantityPurchased = @p1
WHERE BillID = @p2 AND MedicineID = @p3 AND LastModifiedOn = @p4;

Edit:

Мои вопросы:
1- Почему обновление только количества работает, но обновление лекарства - исключение?
2- Можно ли заставить Nhibernate обновить свойство лекарства? Если да, то как? Если нет, может кто-нибудь предложить обходной путь?

Ответы [ 2 ]

3 голосов
/ 08 октября 2010

NHibernate не позволяет изменять первичный ключ.

Возможные обходные пути:

  • Создание нового экземпляра с новым лекарством и удаление старого
  • Использование обновление HQL для изменения Медицины.Помните, что состояние в памяти не будет соответствовать БД, если вы не Evict экземпляр и не загрузите его снова.
0 голосов
/ 08 октября 2010

Я думаю, вы должны создать еще один объект, потому что у меня здесь дежа-вю. Вы пытаетесь

  1. создать объект с ключом B1 M1
  2. сохранить
  3. с тем же объектом и тем же ссылка, смена ключа на B1 M2
  4. обновление нового объекта (со старым ссылка) * +1010 *

Я бы порекомендовал либо flushing your session между сохранением и обновлением, либо using a transaction для каждой из операций (хотя очистки должно быть достаточно, я рекомендую транзакцию только потому, что это хорошая практика :)). Такое ощущение, что вы пытаетесь обновить объект, который еще не был вставлен

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...