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不返回任何内容,因此我们需要使用持久化对象来获取生成的标识符值。
- Java NoClassDefFound错误
- PostgreSQL串行类型的Hibernate注释
- 使用Spring 3,maven,JPA,c3p0在hibernate中“java.lang.NoSuchFieldError:NONE”
- Jpa和Hibernate是否加载在DB中异步更改的数据?
- Hibernate – 连接被拒绝
- Hibernate单向OneToMany删除违反约束(在父端可选= false?)
- org.hibernate.internal.util.config.ConfigurationException:找不到cfg.xml资源
- 如何使用Hibernate映射MySQL DATE’EMA’&TIME ’00:00:00′
- 如何在Hibernate Interceptor中获取Hibernate会话?