Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate 持久性上下文缓存id和SQL查询?_Hibernate - Fatal编程技术网

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

Hibernate 持久性上下文缓存id和SQL查询?,hibernate,Hibernate,如果一次调用session.save(customerObject),则无插入客户…查询数据库Hibernate将设置id属性(“序列”或“增量”生成器),并将实体绑定到持久性上下文。调用transaction.commit()时,持久性上下文与数据库同步 问:Hibernate将在哪里设置id属性? 问:在与db同步之前,持久性上下文是否会缓存sql查询插入到customer中?我的意思是,sql何时生成(在执行save或session.flush/tx.commit时) 编辑:我从下面的 p

如果一次调用
session.save(customerObject)
,则插入客户…查询数据库Hibernate将设置id属性(“序列”或“增量”生成器),并将实体绑定到持久性上下文。调用
transaction.commit()
时,持久性上下文与数据库同步
问:Hibernate将在哪里设置id属性?
问:在与db同步之前,持久性上下文是否会缓存sql查询插入到customer中?我的意思是,sql何时生成(在执行save或session.flush/tx.commit时)

编辑:我从下面的

persist()定义良好。它使临时实例持久化。但是,它不能保证标识符值将立即分配给持久实例,分配可能发生在刷新时。规范没有这样说,这就是我在persist()中遇到的问题

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

需要一个类似persist()的方法

save()不保证相同,它返回一个标识符,如果必须执行插入以获取标识符(例如“标识”生成器,而不是“序列”),则此插入会立即发生,无论您是在事务内部还是外部。在具有扩展会话/持久性上下文的长时间运行对话中,这都不好


这更让人困惑

一般来说,Hibernate会尽可能最新地写入数据库,而不会影响程序的正确性,并且遵守它提供的方法契约

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

由于
persist()
不能保证在调用标识符时分配该标识符,因此在调用
persist()
后不能指望分配ID。您也不能期望将实体写入数据库,因为这不是
persist()
所做的。就这么简单


只有在刷新会话时、提交前自动执行或在调用
flush()
时明确执行对数据库的写入操作,才能保证执行。如果执行一个查询,其结果可能取决于挂起的写入操作,您还可以保证执行对DB的写入操作。

也许您应该将其分解为多个SO问题,因为我不完全确定这里要问什么。您还可以展示如何注释
学生.class
(特别是id属性。您刚才回答了自己的问题吗?您还有问题吗?@JBNizet if“sequence”或“Increment”使用生成器,然后问:Hibernate将在何处设置id属性?问:在与db同步之前,持久性上下文是否将sql查询缓存到customer中?我的意思是,何时生成sql(在执行save或session.flush/tx.commit时)