如果有一个电话session.save(customerObject)
,则没有插入到客户...查询到数据库。 Hibernate将设置id属性(" sequence"或" Increment" generator)并将实体绑定到持久化上下文。调用transaction.commit()
时,持久性上下文与数据库同步
问:Hibernate将在哪里设置id属性?
问:在与db同步之前,持久化上下文是否会将sql查询插入到客户...中?我的意思是,什么时候生成sql(在执行save或session.flush / tx.commit时)
编辑:我从https://forum.hibernate.org/viewtopic.php?t=951275&highlight=difference%20persist%20save
获得了下方persist()定义明确。它使瞬态实例持久化。但是,它并不保证标识符值将立即分配给持久性实例,分配可能在刷新时发生。该规范并没有说明,这就是我对persist()的问题。
persist()还保证如果在事务边界之外调用它,它将不会执行INSERT语句。这对于具有扩展会话/持久性上下文的长时间运行会话非常有用。
需要像persist()这样的方法。
save()不保证相同,它返回一个标识符,如果必须执行INSERT来获取标识符(例如"身份"生成器,不是"序列& #34;),无论你是在事务的内部还是外部,这个INSERT都会立即发生。这与使用扩展的会话/持久化上下文的长时间对话并不好。
这更令人困惑
答案 0 :(得分:0)
通常,Hibernate尝试尽可能最新地写入数据库,而不会影响程序的正确性,并尊重它提供的方法的契约。
由于记录了save()
来为保存的实体分配ID并返回此ID,因此在调用save()
时会生成ID,并将其返回。这可能意味着实体是否写入数据库,具体取决于ID生成策略。
由于persist()
不能保证在调用标识符时分配标识符,因此在调用persist()
后,您无法指望要分配的标识符。而且你不能指望实体被写入数据库,因为那不是persist()
所做的。就这么简单。
只保证在刷新会话时,在提交之前自动执行写入,或者在调用flush()
时明确执行写入。如果执行的查询结果可能取决于挂起的写入,您还可以保证执行对DB的写入。