当前位置: 首页 > 面试题库 >

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

田博易
2023-03-14
问题内容

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

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

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


问题答案:

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

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

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

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



 类似资料:
  • 我试图更好地理解JPA/Hibernate和SQL服务器的注释。 我创建了一个简单的项目:一个名为“Articles”的抽象类。有两个类继承了它:Ramette添加了权重,Pen添加了颜色。下面的代码无效,我无法更正错误。你有什么想法吗?非常感谢。

  • 问题内容: X项目包含以下部分: 一个。Spring Data存储库具有单独的方法,例如: b。hibernate方式也使用“ xobjects”缓存。 问题#1 由于有两种添加对象以缓存的方法,因此可能是同一对象出现2次的情况。如何更好地解决这个问题?例如,使用结果对象中的键。就像是: 键=“#result.id” 问题#2 我不想在调用“保存”方法时从缓存中逐出所有对象,但是我不确定当前的实现

  • 问题内容: 我试图在我的Seam / Hibernate / JPA应用程序中利用EntityListener对象和回调方法。我在后端使用PostgreSQL 9.1的JBoss 5.1上使用Seam 2.2管理的持久性上下文。我声明了以下实体: 以及以下EntityListener回调类: 但是,当我运行测试时,我没有看到我期望的所有回调方法都被调用。我已经对以下情况进行了测试: 坚持一个新项目

  • 我想知道,当我试图在数据库中创建并持久化对象时,处理异常的最佳方法。 因此,我有一个名为Rule的表,其中包含getter和setter: 我有一个方法create谁在数据库中添加对象: 我应该为每个异常使用多个catch吗?谁的方法可以抛出try块 如果我的解决方案是处理异常的好方法,那么如何才能以好的方式打印与异常相关的特定消息 如何在JUnit5中为块的内容引发异常,以测试是否引发了异常(我

  • 我有一个名为User的实体类,其中包含数据库的OneToMany列: 当我将用户插入数据库时,一切正常,他的汽车也被添加到user_cars表中。当检索汽车时,我得到这个异常: 我已经搜索了其他答案,但没有找到如何解决它。这就是我试图检索用户的方式。 问题是什么?我如何解决?我不明白后台发生了什么。

  • 尝试在已存在行的表中插入新行会导致主键冲突,因为计数器无法正确递增。 我试图使用Spring CrudRepository向一个已经包含两行的表中插入一个新行。如果数据库是空的,它工作正常,那么计数器将按预期工作,当从Spring应用程序外部修改数据库时,问题就出现了,看起来好像计数器丢失了。 目录 波乔: 我得到的错误是:起因于:org . H2 . JDBC . jdbcsqlintegrit