Spring JPA AUTO Flush疑问:save后为何立即执行insert?
问题原因解析
你的问题核心在于主键生成策略对Hibernate flush时机的影响,具体如下:
IDENTITY主键生成策略的强制flush行为
从你的SQL输出insert into post (name,id) values (?,default)可以看出,你的Post实体使用的是IDENTITY类型的主键生成(比如MySQL的自增ID)。这种策略下,主键值由数据库在插入时自动生成,Hibernate为了获取这个生成的ID并绑定到实体对象上,必须在调用save()时立即执行insert语句,无法延迟到后续的查询或事务提交阶段。JPA AUTO flush模式的例外场景
JPA规范中AUTO flush的触发时机是通用规则,但Hibernate作为实现者,会根据主键生成策略做特殊处理:- 对于SEQUENCE、TABLE这类可以在内存中预先生成主键值的策略,Hibernate会把insert操作延迟到flush触发时机(查询前、事务提交前)
- 但IDENTITY策略依赖数据库生成ID,必须立即执行insert才能拿到ID,因此会主动触发flush,打破了延迟执行的预期
验证方式
如果修改Post的主键生成策略为SEQUENCE(比如Oracle序列)或TABLE,你会发现insert语句会延迟到commentRepository.findAll()执行前或者事务提交时才触发。
内容的提问来源于stack exchange,提问作者Mohammad Karmi
相关产品推荐
相关产品推荐

