簡體   English   中英

更改復合ID的一部分

[英]Changing part of a composite-id

我有一堂課BillMedicine,它是Bill和Medicine的多對多表。 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異常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

我已經檢查了NHibernate顯示的SQL,並且它沒有更新葯物

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

編輯:

我的問題:
1-為什么僅更新數量有效但更新葯物會引發異常?
2-是否可以使Nhibernate更新葯物屬性? 如果是,怎么辦? 如果沒有,有人可以建議解決方法嗎?

NHibernate不允許更改主鍵。

可能的解決方法:

  • 使用新葯物創建一個新實例,並刪除舊實例
  • 使用HQL更新來更改葯品。 請記住,除非Evict實例並再次加載它,否則內存中狀態將與數據庫不匹配。

我認為您應該創建另一個對象,因為我在這里有一個deja-vu。 你試圖

  1. 用鍵B1 M1創建一個對象
  2. 保存
  3. 保持相同的對象和相同的參考,將鍵更改為B1 M2
  4. 更新新對象(使用舊參考)

我建議flushing your session保存和更新之間的flushing your session ,或者對每個操作都using a transaction (盡管刷新應該足夠了,我推薦事務只是因為這是一個好習慣:))。 我感覺到您正在嘗試更新尚未插入的對象

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM