Hibernate的save方法执行的是更新操作。

4

我正在处理一个需要向表中插入新审计记录的项目。(例如,新值 vs 旧值),需要更新几个字段。

我要解决的问题:

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:

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

表格背景:

ID 不是自增字段,是手动生成的 ID,基本上它是时间戳+[0-999] 的组合(e.g. 20150412113637011),所以我必须在保存之前手动设置它。该表的主键是由包括 ID 在内的 4 个整数字段组合而成。此外,还有几十个其他审计字段,但我只关心其中的几个。

我尝试过但未奏效的方法:

搜索 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)

不起作用

第三方

Trid使用这种方法saveOrUpdate(Object object)

仍然不起作用。

1个回答

2
如果您想插入新记录,则创建CollabPoApproval类型的新对象,并从所选对象复制值,而不是修改它。Hibernate查看对象的引用,在这种情况下引用没有更改,因此会触发更新语句而不是插入语句。
CollabPoApproval collabPoApproval  = this.collabPoApprovalGateway.findById(key);
CollabPoApproval collabPoApprovalNew = new CollabPoApproval ();
//copy collabPoApproval values to collabPoApprovalNew 
//do other modification
this.collabPoApprovalGateway.save(collabPoApprovalNew );

谢谢Prerak,这解决了我的问题。另一种方法是从会话中调用evict()以清除现有记录(还没有尝试过),我认为它会起作用。 - CharlesC
是的,但那会不必要地使你的代码复杂化。 - Prerak Tiwari

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接