0

如果一个电话session.save(customerObject),那么就没有插入到客户...查询到数据库。Hibernate 将设置 id 属性(“序列”或“增量”生成器)并将实体绑定到持久性上下文。transaction.commit()持久化上下文在被调用时与数据库同步
问:Hibernate 会在哪里设置 id 属性?
问:持久化上下文会在与 db 同步之前缓存插入到 customer 中的 sql 查询吗?我的意思是,什么时候生成 sql(在进行保存或 session.flush/tx.commit 时)

编辑:我从https://forum.hibernate.org/viewtopic.php?t=951275&highlight=difference%20persist%20save得到以下信息

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

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

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

save() 不保证相同,它返回一个标识符,如果必须执行 INSERT 以获取标识符(例如“身份”生成器,而不是“序列”),则无论您是否在里面,此 INSERT 都会立即发生或交易之外。这在具有扩展会话/持久性上下文的长期对话中不好。

这更令人困惑

4

1 回答 1

0

一般而言,Hibernate 尝试尽可能晚地写入数据库,而不影响程序的正确性,并尊重它提供的方法的约定。

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

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

仅保证在刷新会话时、在提交之前自动或在flush()调用时显式地执行对数据库的写入。如果您执行的查询结果可能取决于挂起的写入,您还可以保证执行对 DB 的写入。

于 2013-03-11T21:34:28.710 回答