休眠保存正在更新

问题描述:

在这里,我正在处理一个需要在表中插入新审计记录的项目。 (例如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)

仍然不工作。

如果要插入新记录,则创建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

是的..但是这会不必要地使你的代码复杂化。 –