在JPA / Hibernate中正确使用flush()

我正在收集有关flush()方法的信息,但是我不清楚何时使用它以及如何正确使用它。 从我读到的内容来看,我的理解是持久化上下文的内容将与数据库同步,即发出未完成的语句或刷新实体数据。

现在我有两个实体AB (一对一的关系,但没有强制执行或由JPAbuild模)的以下情况。 A有一个手动设置的组合PK,还有一个自动生成的IDENTITY字段recordId 。 这个recordId应该写入实体B作为A一个外键。 我在一次交易中保存AB 问题是自动生成的值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指令到数据库的最佳时机。