有没有人知道当调用session.saveOrUpdate()
时,Hibernate如何知道是插入还是更新数据库中的值?
目前为止,我只确定它不依赖于缓存中的信息,并且实体在数据库中的存在取决于主键。
.saveOrUpdate()
时,Hibernate会检查对象是否为临时的(它没有标识属性),如果是,则生成标识符并将其分配给会话以使其持久化。如果对象已经有了标识符,则执行.update()
。saveOrUpdate()
做以下几件事情:
saveOrUpdate()
; 让Hibernate决定什么是新的,什么是旧的要容易得多,特别是在具有混合状态的更复杂对象网络中。唯一(不是真正严重的)缺点是只使用saveOrUpdate()
有时无法猜测实例是旧的还是新的,而不必在数据库上触发SELECT - 例如,当一个类与自然组合键映射,并且没有版本或时间戳属性。null
。null
。unsaved-value
,并且标识符属性的值匹配。版本和时间戳映射元素也可用unsaved-value
属性。org.hibernate.Interceptor
,并在您的代码中检查实例后从Interceptor.isUnsaved()
返回Boolean.TRUE
。如此处所述,saveOrUpdate
方法可以通过生成新的标识符来保存瞬态实例或更新/重新关联与其当前标识符相关联的游离实例。更具体地说,它会执行以下操作:
save()
方法保存它save()
方法保存它<version>
或<timestamp>
版本控制,并且版本属性值为save()
方法保存它update()
方法更新对象MyModel sent = myDao.myDaoImpl(id);
if(sent == null){
sent = **new MyModel();** // new Object
sent.setXX(id);
sent.setYY("Yes");
sent.setDate(new Date());
myDao.saveOrUpdate(sent); // Insert will be called
} else if(! "Yes".equalsIgnoreCase(sent.getFlag())) {
sent.setXX("Yes");
sent.setDate(new Date());
myDao.saveOrUpdate(sent); // Update will be called
}
根据主键的值完成此操作。如果主键未定义,则其值将默认为0,用于数字代理键并执行 保存
操作。如果填写了主键,则会调用 更新
操作。
clone()
(保持相同的标识符),并修改了一个值。Hibernateupdate()
该对象。它属于哪个类别? - iliadensession.evict()
被分离了。 - iliaden