在 Hibernate 中,session.persist() 和 session.save() 之间有什么区别?

2022-08-31 06:42:47

谁能告诉我与Hibernate相比有什么优势?persist()save()


答案 1

这个论坛帖子

persist()定义明确。它使瞬态实例持久化。但是,它不保证标识符值将立即分配给持久性实例,分配可能会在刷新时发生。规范没有这么说,这就是我遇到的问题。persist()

persist()还保证在事务边界之外调用 INSERT 语句时,它不会执行该语句。这在具有扩展会话/持久性上下文的长时间运行的对话中很有用。

需要类似的方法。persist()

save()不保证相同,它返回一个标识符,并且如果必须执行INSERT才能获得标识符(例如“身份”生成器,而不是“序列”),则无论您在交易内部还是外部,此INSERT都会立即发生。这在具有扩展会话/持久性上下文的长期运行对话中是不好的。


答案 2

我已经对 save() vs. persist() 进行了很好的研究,包括在我的本地机器上运行它几次。前面的所有解释都是令人困惑和不正确的。经过彻底的研究,我在下面比较了save()和concept()方法。

Save()

  1. 返回保存后生成的 Id。其返回类型为Serializable;
  2. 将对数据库的更改保存在事务之外;
  3. 将生成的 id 分配给要持久化的实体;
  4. session.save()中分离的对象将在表中创建新行。

Persist()

  1. 保存后不返回生成的 Id。其返回类型为void;
  2. 不将更改保存到事务外部的数据库;
  3. 将生成的 Id 分配给要持久化的实体;
  4. session.persist()对于分离的对象将抛出一个 ,因为它是不允许的。PersistentObjectException

所有这些都在 上尝试/测试。Hibernate v4.0.1


推荐