save和saveOrUpdate方法之间的区别hibernate
通常我读过关于save()方法生成对象的新标识符并且只触发INSERT并保存它,它不会更新它,而saveOrUpdate()方法可能会INSERT或UPDATE记录。
但根据我的经验,我可以通过示例代码更好地解释,
假设有A类 ,我从表A中找到记录
A a = getHibernateTemplate.findById(7);
所以现在我得到一个持久对象,
现在我试图通过简单修改一些字段来保存使用save方法的记录,
现在我开火了,
getHibernateTemplate.save(a);
所以它只是更新现有记录 ,但据我所知, 它应该创建新的记录 。
我可能对certian事情有误,有人可以清楚这个吗?
保存
Save method
将object
存储到数据库中。 它将保留给定的瞬态实例,首先分配生成的标识符。 它returns
创建的实体的id 。
然而,
saveOrUpdate()方法
根据标识符的存在或不存在调用save()
或update()
。 例如,如果存在标识符,则将调用update()
否则将调用save()
。
还有更多像persist(),merge(),saveOrUpdateCopy() 。 几乎所有都是相同的,提供略微不同的function和可用性。
有关更多信息,请阅读此内容。 Hibernate中不同的保存方法有什么区别?
org.hibernate.Session类方法,save&saveOrUpdate之间的重要区别是, save
生成新标识符并导致INSERT查询,而saveOrUpdate执行INSERT或UPDATE。
保存
Save方法将对象存储到数据库中。 这意味着如果标识符不存在,它会插入一个条目,否则会抛出错误。 如果主键已经存在于表中,则无法插入。
saveOrUpdate
此方法基于操作调用save()或update()。 如果标识符存在,它将调用update方法,否则将调用save方法。 saveOrUpdate()方法执行以下操作:
如果对象在当前会话中已经持久化,则它什么都不做如果与该会话关联的另一个对象具有相同的标识符,则向调用者抛出exception如果该对象没有标识符属性,则save()该对象如果该对象的标识符具有分配给新实例化对象的值,save()该对象
从这里了解更多。
save()
应该将瞬态实例作为参数,而不是持久化实例。 javadoc并不是非常详尽,但是AFAIK在持久化实例上调用save()
没有任何效果,除了将操作级联到连接到实体的瞬态实例之外,是这样的级联配置。
请注意,通常没有理由在附加的持久化实体上调用save()
或saveOrUpdate()
,因为Hibernate会对实体进行脏检查并自动保留更改。
所以它只是更新现有记录,但据我所知,它应该创建新记录:是的它应该创建一个新记录。 但是这种行为仅适用于不是持久对象的瞬态对象。
通过调用load加载对象的那一刻,此对象与session(持久状态)相关联。 而且由于脏检查,这个对象无论如何都会在刷新期间更新。
但是,如果这个对象是一个新对象,它实际上在调用save()或saveoOrUpdate()api时会有所不同。