持久化上下文缓存id和SQL查询?

时间:2013-03-11 18:02:39

标签: hibernate

如果有一个电话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都会立即发生。这与使用扩展的会话/持久化上下文的长时间对话并不好。

这更令人困惑

1 个答案:

答案 0 :(得分:0)

通常,Hibernate尝试尽可能最新地写入数据库,而不会影响程序的正确性,并尊重它提供的方法的契约。

由于记录了save()来为保存的实体分配ID并返回此ID,因此在调用save()时会生成ID,并将其返回。这可能意味着实体是否写入数据库,具体取决于ID生成策略。

由于persist()不能保证在调用标识符时分配标识符,因此在调用persist()后,您无法指望要分配的标识符。而且你不能指望实体被写入数据库,因为那不是persist()所做的。就这么简单。

只保证在刷新会话时,在提交之前自动执行写入,或者在调用flush()时明确执行写入。如果执行的查询结果可能取决于挂起的写入,您还可以保证执行对DB的写入。