休眠保存正在更新
问题描述:
在这里,我正在处理一个需要在表中插入新审计记录的项目。 (例如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);
谢谢Prerak,这解决了我的问题。我的同事建议的另一种方法是从会话中调用evict()现有记录。 (还没有机会尝试它),我认为它会起作用。 –
是的..但是这会不必要地使你的代码复杂化。 –