一尘不染

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

hibernate

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

现在,我得到了具有两个实体的场景,A并且B(一对一关系,但未由JPA强制执行或建模)。A具有手动设置的复合PK,还具有自动生成的IDENTITY字段recordId。这recordId应该B作为的外键写入到实体A。我要存钱,A并且要B进行一次交易。问题是自动生成的价值A.recordId是不可用的事务中,除非我做的一个显式调用em.flush()打完电话后em.persist()A。(如果我有一个自动生成的IDENTITY
PK,那么该值将直接在实体中更新,但是这里不是这种情况。)

可以em.flush()在一个事务中使用时造成什么伤害?


阅读 1216

收藏
2020-06-20

共1个答案

一尘不染

的确切细节可能em.flush()取决于实现。总之,无论如何,像Hibernate这样的JPA提供程序可以缓存应该发送给数据库的SQL指令,通常直到您真正提交事务为止。例如,您调用em.persist(),Hibernate记住它必须使数据库INSERT,但是直到您提交事务后,它才真正执行该指令。Afaik,这样做主要是出于性能方面的考虑。

在某些情况下,无论如何,您都希望立即执行SQL指令。通常,当您需要某些副作用(例如自动生成的密钥或数据库触发器)的结果时。

要做的em.flush()是清空内部SQL指令缓存,并立即对其执行数据库。

底线:不会造成任何伤害,因为您将优先考虑将JPA提供程序发送到数据库的最佳时间,因为您要覆盖JPA提供程序的决定,因此对性能的影响不大。

2020-06-20