1

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

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

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

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

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

你能帮我理解坚持说:

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

这里的事务边界是什么?什么是长期对话?扩展会话/持久性上下文是什么意思?

也用于保存方法:

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

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

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

4

4 回答 4

5

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

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

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

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

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

希望有帮助。

于 2013-11-15T06:04:21.947 回答
1

save 和 persist 方法之间的主要区别之一是取决于 ID 生成策略。基本上 save() 方法会将 value(id) 返回给客户端,而 persist() 方法不会..

1)如果您让 ORM 引擎为您生成 ID,在这些情况下您可以使用 save()。原因很简单“休眠让您有机会了解它生成/用于持久化对象的 ID "

2)如果您自己生成了您的 id(分配的 ID 生成策略)并将其传递给 ORM 引擎以使用它来持久化您的对象。在这种情况下,persist() 将是合适的。

点击这里

就像我说的

“这取决于 ID 生成策略”

干杯!

于 2013-11-15T08:04:19.097 回答
1

save()方法可以返回由 hibernate 生成的主键 id 值,我们可以通过

long s = session.save(k);

在这种情况下,persist()永远不会将任何价值回馈给客户,希望您清楚。

所以persist()方法保证如果在事务边界之外调用它不会执行 INSERT 语句,因为在持久化对象后不需要获取 id。

而该save()方法不能保证相同,因为它需要返回一个标识符(可能是主键 id)。

必须执行 INSERT 以获取标识符(例如“身份”生成器),因此,save()无论您是在事务内部还是外部,此 INSERT 都会立即发生。

于 2013-11-15T05:43:22.687 回答
0

As the method name suggests, hibernate save() can be used to save entity to database. We can invoke this method outside a transaction. If we use this without transaction and we have cascading between entities, then only the primary entity gets saved unless we flush the session

Hibernate persist is similar to save (with transaction) and it adds the entity object to the persistent context, so any further changes are tracked. If the object properties are changed before the transaction is committed or session is flushed, it will also be saved into database. Also, we can use persist() method only within the boundary of a transaction, so it’s safe and takes care of any cascaded objects. Finally, persist doesn’t return anything so we need to use the persisted object to get the generated identifier value.

于 2015-04-20T20:06:31.237 回答