Hibernate持续vs保存

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

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

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

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

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

能否请你帮助我理解持续存在的说法:

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

这里的交易边界是什么? 什么是长期对话? 什么是扩展的Session / persistence context意味着什么?

另外用于保存方法:

无论您是在交易内部还是外部,这种INSERT都会立即发生。 这与使用扩展的会话/持久性上下文的长时间对话不太好。

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

我是新手,并且很难理解差异,请你帮我理解差异。

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

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

因此,Hibernate Session需要在该工作单元的开头打开并在结束时关闭 – 手动或通过某种容器管理。

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

同时save立即执行插入并为您的实体提供数据库中的id。 这在长时间运行的会话期间并不好,因为您希望数据库操作是primefaces的 – 全部或全部。 奇怪的事情可能会发生相同数据的多次插入。

希望有所帮助。

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

 long s = session.save(k); 

在同样的情况下, persist()永远不会给客户端任何价值,希望你清楚。

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

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

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

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

1)在你让你的ORM引擎为你生成ID的情况下,在这种情况下你可以使用save()。原因很简单“Hibernate让你有机会知道它生成/用来保存你的对象的ID “

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

点击这里

就像我说的

“这取决于ID生成策略”

干杯!

正如方法名称所示,hibernate save()可用于将实体保存到数据库。 我们可以在事务外调用此方法。 如果我们在没有事务的情况下使用它,并且我们在实体之间进行级联,那么除非我们刷新会话,否则只保存主实体

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