25

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

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

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

A a = getHibernateTemplate.findById(7);

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

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

现在我开枪了,

getHibernateTemplate.save(a);

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

我可能对某些事情有误,有人可以澄清一下吗?

4

4 回答 4

28

节省

Savemethod将 an 存储object到数据库中。它将持久化给定的瞬态实例,首先分配一个生成的标识符。它是创建的实体returnsID

然而,

保存或更新()

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

还有更多类似的persist()、merge()、saveOrUpdateCopy()。几乎所有都相同,功能和可用性略有不同。

有关更多信息,您可以阅读此内容。 Hibernate中不同的保存方式有什么区别?

于 2013-07-12T10:12:53.740 回答
9

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

节省

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

保存或更新

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

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

从这里阅读更多信息。

于 2013-07-12T10:09:14.493 回答
3

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

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

于 2013-07-12T10:12:27.487 回答
0

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

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

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

于 2013-07-12T10:14:45.450 回答