2015-10-15 62 views
4

在這裏,我正在處理一個需要在表中插入新審計記錄的項目。 (例如new_vale vs old_value),以及需要更新的情侶字段。休眠保存正在更新

問題我tryint解決:

session.save()沒有執行「插入」,而是它是執行「UPDATE」

private void updateCollabPoApprovaForASN(CollabPoApprovalKey key, PurchaseOrderUpdateASN updateAsn){ 
     CollabPoApproval collabPoApproval = this.collabPoApprovalGateway.findById(key); 

     compareAndSetChangedValue(updateAsn, collabPoApproval); 
     key.setChangeId(generateId()); 
     collabPoApproval.setKey(key); 

     this.collabPoApprovalGateway.save(collabPoApproval); 

} 

基本上,我所做的是,我使用Hibernate查詢搶回來的現有記錄,然後我修改了主鍵通過手動設置ID和我更新那些情侶審計領域。最後,將它保存回數據庫。

SQL生成:

update CollabPoApproval set OLD_DRAWING_NUMBER=?, NEW_DRAWING_NUMBER=? ... where ID=? and SU_ID=? and PO=? and LINE=? 

背景表的:

的ID不是自動遞增字段,它是手動生成的ID,基本上它是TimeStamp+[0-999]的組合(例如20150412113637011),所以我必須在保存之前手動設置它。
表的主鍵是包括ID在內的4個字段的組合,並且它們都是整數。此外,它還包括幾十個其他審計字段,我只關心幾個字段。

事情我都試過不行:

谷歌/計算器搜索和嘗試不同的方法。


添加以下發電機(我相信這一個是默認值):

<generator class="assigned" /> 

所以HBM組合大-ID就像是以下幾點:

<composite-id class="CollabPoApprovalKey" name="key"> 
    <key-property name="Id" column="ID" type="long" /> 
    <key-property name="suId" column="SU_ID" type="integer" /> 
    <key-property name="po" column="PO" type="integer" /> 
    <key-property name="line" column="LINE" type="short" /> 
    <generator class="assigned" /> 
</composite-id> 

第二

試過用這種方法save(String entityName, Object object)通過

this.collabPoApprovalGateway.save("CollabPoApproval",CollabPoApproval) 

不工作

TRID使用此方法saveOrUpdate(Object object)

仍然不工作。

回答

2

如果要插入新記錄,則創建CollabPoApproval類型的新對象,並從所選對象中複製值而不是修改它。 Hibernate會查看對象的引用,在這種情況下,引用不會改變它爲什麼會觸發update語句而不是insert。

CollabPoApproval collabPoApproval = this.collabPoApprovalGateway.findById(key); 
CollabPoApproval collabPoApprovalNew = new CollabPoApproval(); 
//copy collabPoApproval values to collabPoApprovalNew 
//do other modification 
this.collabPoApprovalGateway.save(collabPoApprovalNew); 
+0

謝謝Prera​​k,這解決了我的問題。我的同事建議的另一種方法是從會話中調用evict()現有記錄。 (還沒有機會嘗試它),我認爲它會起作用。 –

+0

是的..但是這會不必要地使你的代碼複雜化。 –