org.hibernate.Session.save() 方法具体是做什么的?

24
我知道Session.save()将持久化瞬态对象。我还看到它也有saveOrUpdate()persist()
那么我认为save()相当于SQL INCLUDE,是吗?
如果我有一个已经存在于数据库中的对象,并且我使用save()对其进行操作,会发生什么?另一行会被包含吗?它的字段会被更新吗?还是只会被忽略,什么都不会发生?

嗨,你有查看过 Hibernate 文档吗:http://www.hibernate.org/docs ?你没有提到你使用的版本。请在以后使用代码块。谢谢。 - Bizmarck
4个回答

24

savesaveOrUpdate方法之间的主要区别是,save会生成一个新的标识符,并将记录INSERT到数据库中,而saveOrUpdate根据记录是否存在可以进行INSERTUPDATE操作。因此,save在执行之前不会执行存在性检查,而saveOrUpdate会检查记录是否存在,如果存在,则更新该记录,否则插入一条新记录。

persistsave之间的基本区别

  1. 第一个区别是savepersist的返回类型。与save方法类似,persist方法也会将记录插入数据库,但persist的返回类型是void,而save的返回类型是Serializable object

  2. persistsave的另一个区别是两种方法都可以使一个临时实例持久化。然而,persist方法不能保证标识符值会立即分配给持久化实例,分配可能在刷新时发生。


2
如果id是手动分配的(并且存在于数据库中),save()方法可以执行SQL更新。 - Kacper86

6
     save Persists an entity. Will assign an identifier if one doesn't exist.
     If one does, it's essentially doing an update. 
     Returns the generated ID of the entity.

我建议您在进一步操作之前阅读这个。这将有助于您更好地理解Hibernate中不同的保存方法。


谢谢。save() - 如果必须执行INSERT来获取标识符,则无论您是否在事务内部或外部,此INSERT都会立即发生。这在与扩展的Session /持久性上下文进行长时间对话时会出现问题。 请问如何在Session之外执行插入操作,为什么这样做不好? - Erran Morad

2
据我所知,它的执行方式如下:
1. `save()` 只是保存您的实体。 2. `persist()` 将您的实例修改为托管实体。这意味着,如果您对其进行操作并且事务仍然打开,则在调用 `flush()` 时它将自动保存(如果我没有弄错的话)。 3. `merge()` 还有这个,类似于 `persist()`,但它返回一个新实例而不是修改旧实例。 4. `saveOrUpdate()` 您可以在此处查看区别。

1

save() 方法将记录插入数据库。但是 saveorupdate() 方法会检查主键,如果找到主键,则更新数据,否则将数据插入到数据库中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接