繁体   English   中英

休眠保持与保存

[英]Hibernate persist vs save

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

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

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

需要诸如persist()之类的方法。

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

能否请您帮助我理解以下内容:

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

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

也用于保存方法:

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

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

我刚冬眠,难以理解差异,请您帮我理解差异。

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

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

因此,Hibernate Session需要在该工作单元的开始处打开,然后在结束时关闭–可以手动或通过某种容器管理进行。

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

同时save立即执行插入操作,并从数据库中为您的实体提供ID。 在长时间的对话中,这不好,因为您希望数据库操作是原子的-全部或全部都不做。 可能会发生奇怪的事情,例如同一数据的多次插入。

希望能有所帮助。

save()方法可以返回由hibernate生成的主键id值,我们可以通过以下方式查看它:

long s = session.save(k);

在这种情况下, persist()永远不会给客户端任何价值,希望您一切都清楚。

因此, persist()方法可确保如果在事务边界之外调用它,则不会执行INSERT语句,因为在持久化对象后无需获取ID。

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

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

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

1)在让您的ORM引擎为您生成ID的情况下,您可以使用save()。原因很简单:“休眠使您有机会了解它已生成/使用了什么ID来持久化对象”

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

点击这里

就像我说的

“取决于ID生成策略”

干杯!

顾名思义,hibernate save()可用于将实体保存到数据库。 我们可以在事务外部调用此方法。 如果我们在不使用事务的情况下使用此方法,并且在实体之间进行级联,那么只有主实体才能保存,除非刷新会话

Hibernate持久性类似于保存(带有事务),并且将实体对象添加到持久性上下文中,因此可以跟踪任何进一步的更改。 如果在提交事务或刷新会话之前更改了对象属性,则该对象属性还将保存到数据库中。 另外,我们只能在事务的边界内使用persist()方法,因此它是安全的,并且可以处理所有级联的对象。 最后,persist不返回任何内容,因此我们需要使用persisted对象来获取生成的标识符值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM