Hibernate save正在进行更新

时间:2015-10-15 14:56:39

标签: java sql-server hibernate persistence

这里我正在开发一个需要在表中插入新审计记录的项目。 (例如new_vale vs old_value),需要更新几个字段。

问题我试着解决:

session.save()未执行“INSERT”,而是执行“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 Generated:

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

表背景

ID不是自动增量字段,它是手动生成的ID,基本上它是TimeStamp+[0-999]的组合(例如20150412113637011),所以我必须在保存之前手动设置它。
该表的主键是4个字段的组合,包括ID,它们都是整数。除此之外,它还包括几十个其他审计字段,我只关心一些。

我尝试过的东西不起作用:

Google / StackOverFlow搜索并尝试了不同的方法。

第一
添加以下生成器(我相信这是默认的):

<generator class="assigned" />

所以hbm composit-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)

不起作用

第三

使用此方法saveOrUpdate(Object object)

仍然无法正常工作。

1 个答案:

答案 0 :(得分: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 );