在JPA / Hibernate中正确使用flush()
我正在收集有关flush()方法的信息,但是我不清楚何时使用它以及如何正确使用它。 从我读到的内容来看,我的理解是持久化上下文的内容将与数据库同步,即发出未完成的语句或刷新实体数据。
现在我有两个实体A
和B
(一对一的关系,但没有强制执行或由JPAbuild模)的以下情况。 A
有一个手动设置的组合PK,还有一个自动生成的IDENTITY字段recordId
。 这个recordId
应该写入实体B
作为A
一个外键。 我在一次交易中保存A
和B
问题是自动生成的值A.recordId
在事务中不可用,除非在A
上调用em.persist()
之后,明确调用em.flush()
。 (如果我有一个自动生成的IDENTITY PK,那么值直接在实体中更新,但这不是这种情况。)
在事务中使用em.flush()
会造成什么危害?
em.flush()
的确切细节可能是依赖于实现的。 总的来说,像Hibernate这样的JPA提供者可以caching它们应该发送到数据库的SQL指令,通常直到你实际提交事务。 例如,您调用em.persist()
,Hibernate会记住它必须创build一个数据库INSERT,但在提交事务之前并不真正执行指令。 Afaik,这主要是出于性能的原因。
在某些情况下,您希望SQL指令立即执行; 一般当你需要一些副作用的结果,如自动生成的键或数据库触发器。
em.flush()
所做的是清空内部SQL指令caching,并立即将其执行到数据库。
底线:没有伤害,只有你可以有一个(次要的)性能打击,因为你是覆盖JPA提供商的决定关于发送SQL指令到数据库的最佳时机。