休眠保存正在更新
Hibernate save is doing update
我正在处理一个需要将新审计记录插入 table 的项目。 (例如 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);
}
基本上,我所做的是,我使用休眠查询来抓取现有记录,然后通过手动设置 ID 修改主键,并更新这对审计字段。最后,将其保存回数据库。
SQL 生成:
update CollabPoApproval set OLD_DRAWING_NUMBER=?, NEW_DRAWING_NUMBER=? ... where ID=? and SU_ID=? and PO=? and LINE=?
table的背景:
ID不是自增字段,是手动生成的ID,基本上是TimeStamp+[0-999]
的组合(如20150412113637011
),所以我得手动设置才行保存。
table 的主键是包括 ID 在内的 4 个字段的组合,它们都是 integers.Besides,它还包括其他几十个我只关心的几个审计字段.
我尝试过但不起作用的方法:
Google/Whosebug 搜索并尝试了不同的方法。
第一
添加以下生成器(我相信这是默认的):
<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)
不工作
第三
尝试使用此方法saveOrUpdate(Object object)
还是不行。
如果要插入新记录,则创建 CollabPoApproval 类型的新对象并从所选对象复制值而不是修改它。 Hibernate 查看对象的引用,在这种情况下,引用不会改变它触发更新语句而不是插入的原因。
CollabPoApproval collabPoApproval = this.collabPoApprovalGateway.findById(key);
CollabPoApproval collabPoApprovalNew = new CollabPoApproval ();
//copy collabPoApproval values to collabPoApprovalNew
//do other modification
this.collabPoApprovalGateway.save(collabPoApprovalNew );
我正在处理一个需要将新审计记录插入 table 的项目。 (例如 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);
}
基本上,我所做的是,我使用休眠查询来抓取现有记录,然后通过手动设置 ID 修改主键,并更新这对审计字段。最后,将其保存回数据库。
SQL 生成:
update CollabPoApproval set OLD_DRAWING_NUMBER=?, NEW_DRAWING_NUMBER=? ... where ID=? and SU_ID=? and PO=? and LINE=?
table的背景:
ID不是自增字段,是手动生成的ID,基本上是TimeStamp+[0-999]
的组合(如20150412113637011
),所以我得手动设置才行保存。
table 的主键是包括 ID 在内的 4 个字段的组合,它们都是 integers.Besides,它还包括其他几十个我只关心的几个审计字段.
我尝试过但不起作用的方法:
Google/Whosebug 搜索并尝试了不同的方法。
第一
添加以下生成器(我相信这是默认的):
<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)
不工作
第三
尝试使用此方法saveOrUpdate(Object object)
还是不行。
如果要插入新记录,则创建 CollabPoApproval 类型的新对象并从所选对象复制值而不是修改它。 Hibernate 查看对象的引用,在这种情况下,引用不会改变它触发更新语句而不是插入的原因。
CollabPoApproval collabPoApproval = this.collabPoApprovalGateway.findById(key);
CollabPoApproval collabPoApprovalNew = new CollabPoApproval ();
//copy collabPoApproval values to collabPoApprovalNew
//do other modification
this.collabPoApprovalGateway.save(collabPoApprovalNew );