save和saveOrUpdate方法之间的区别是hibernate

时间:2013-07-12 10:02:35

标签: java hibernate

通常我读过有关save()方法为对象生成新标识符并且只触发 INSERT 并保存它,它不会更新它,而saveOrUpdate()方法可能 INSERT 更新记录。

但根据我的经验,我可以通过示例代码更好地解释,

假设 A类,我从表A 中找到记录

A a = getHibernateTemplate.findById(7);

所以现在我得到一个持久对象,

现在我试图通过简单修改一些字段来保存记录,

现在我开火了,

getHibernateTemplate.save(a);

所以它只是更新现有记录,但据我所知它应创建新记录

我可能对证明事情有误,有人可以清楚这个吗?

4 个答案:

答案 0 :(得分:27)

保存

保存methodobject存储到数据库中。它将保留给定的瞬态实例,首先分配生成的标识符。 returns创建的实体的 id

然而,

<强> saveOrUpdate()方法

根据标识符是否存在,调用save()update()。例如,如果存在标识符,则将调用update(),否则将调用save()

还有更多像 persist(),merge(),saveOrUpdateCopy()。几乎所有都是相同的,提供了不同的功能和可用性。

更多信息,请阅读此内容。 What are the differences between the different saving methods in Hibernate?

答案 1 :(得分:10)

org.hibernate.Session类方法之间的重要区别,save&amp; saveOrUpdate是,save生成一个新标识符并导致INSERT查询,而saveOrUpdate执行INSERT或UPDATE。

保存

Save方法将对象存储到数据库中。这意味着如果标识符不存在,它会插入一个条目,否则会抛出错误。如果主键已经存在于表中,则无法插入。

<强> saveOrUpdate

此方法根据操作调用save()或update()。如果标识符存在,它将调用update方法,否则将调用save方法。 saveOrUpdate()方法执行以下操作:

  

如果对象在当前会话中已经持久化,则不执行任何操作       如果与会话关联的另一个对象具有相同的标识符,则向调用者抛出异常       如果对象没有identifier属性,则save()该对象       如果对象的标识符具有分配给新实例化对象的值,则保存()对象

here了解详情。

答案 2 :(得分:2)

save()应该将瞬态实例作为参数,而不是持久化实例。 javadoc并不是非常详尽,但AFAIK在持久化实例上调用save()没有任何效果,除了将操作级联到连接到实体的瞬态实例之外,是这样的级联配置。

请注意,通常没有理由在附加的持久化实体上调用save()saveOrUpdate(),因为Hibernate会对实体进行脏检查并自动保留更改。

答案 3 :(得分:0)

所以它只是更新现有记录,但据我所知,它应该创建新记录:是的它应该创建一个新记录。但是这种行为仅适​​用于不是持久对象的瞬态对象。

通过调用load加载对象的那一刻,此对象与session(持久状态)相关联。并且由于脏检查,在刷新期间无论如何都会更新此对象。

但是,如果这个对象是一个新对象,那么在调用save()或saveoOrUpdate()api时实际上会有所不同。