Hibernate 持久化 vs 保存

Cha*_*nya 1 java hibernate

当我试图理解 Hibernate Save 和 persist 之间的时候,我遇到了这个解释:

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

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

需要像persist()这样的方法。

save() 不保证相同,它返回一个标识符,并且如果必须执行 INSERT 来获取标识符(例如“身份”生成器,而不是“序列”),无论您是否在里面,这个 INSERT 都会立即发生或在交易之外。这在具有扩展会话/持久性上下文的长时间运行的对话中并不好。

你能帮我理解坚持的线条说:

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

这里的交易边界是什么?什么是长时间的对话?扩展会话/持久上下文是什么意思?

也用于保存方法:

无论您是在事务内部还是外部,此 INSERT 都会立即发生。这在具有扩展会话/持久性上下文的长时间运行的对话中并不好。

我知道如果我们在我的程序中使用 save 方法来保存对象,我们不需要像 session.beginTransaction() 和 session.getTransaction().commt() 这样的语句。如果声明在这里说同样的话,请告诉我。那么这在长时间运行的对话中有什么用呢?

我是 hibernate 的新手,很难理解这些差异,你能帮我理解这些差异吗?

Vid*_*dya 5

您的问题与Hibernate 实现的View模式中的Open Session 有关

这个想法是,您可能在需要在整个特定进程中运行的 Web 应用程序中有一个原子工作单元。想象一下在线订购食物。您在一页上登录,在下一页选择比萨饼和配料,在下一页添加甜点,在下一页添加饮料,并在最后一页付款。您希望整个过程成为一个单一的工作单元。

因此,HibernateSession需要在该工作单元开始时打开并在结束时关闭——手动或通过某种容器管理。

persist在该对话期间调用不会导致任何数据插入,但会使分离的实体持久化。Hibernate 将“记录”所有要进行的插入,然后在对话结束时刷新它们。

同时save立即插入并从数据库中为您的实体提供一个 id。这在长时间运行的对话中并不好,因为您希望数据库操作是原子的——要么全有要么全无。可能会发生诸如多次插入相同数据之类的奇怪事情。

希望有帮助。