|
|
谈吐大方的警车 · VBA数据库解决方案第18讲:数据库中Rec ...· 1 年前 · |
|
|
个性的韭菜 · SQL---insert方法中使用forea ...· 2 年前 · |
|
|
坚强的机器猫 · bootstrap弹窗modal垂直居中,最 ...· 2 年前 · |
|
|
文武双全的小笼包 · 【已解决】Python使用sql语句模糊查询 ...· 2 年前 · |
|
|
重感情的茶壶 · swift - How to ...· 2 年前 · |
我正在收集有关flush()方法的信息,但我不太清楚何时使用它以及如何正确使用它。据我所知,我的理解是持久化上下文的内容将与数据库同步,即发出未完成的语句或刷新实体数据。
现在我得到了两个实体
A
和
B
的场景(在一对一关系中,但不是由JPA强制执行或建模的)。
A
有一个手动设置的复合PK,也有一个自动生成的身份字段
recordId
。此
recordId
应作为
A
的外键写入实体
B
。我在单个事务中保存
A
和
B
。问题是自动生成的值
A.recordId
在事务中不可用,除非我在
A
上调用
em.persist()
之后显式调用
em.flush()
。(如果我有一个自动生成的身份PK,那么实体中的值将直接更新,但这里不是这种情况。)
在事务中使用
em.flush()
时,
是否会造成任何危害?
可能
em.flush()
的确切细节依赖于实现。总之,像Hibernate这样的JPA提供者可以缓存它们应该发送到数据库的SQL指令,通常直到您实际提交事务为止。例如,您调用
em.persist()
,Hibernate记得它必须进行数据库插入,但直到您提交事务时才实际执行指令。Afaik,这主要是出于性能原因。
在某些情况下,无论如何您都希望立即执行SQL指令;通常在需要某些副作用的结果时,比如自动生成的键或数据库触发器。
em.flush()
所做的是清空内部SQL指令缓存,并将其立即执行到数据库中。
归根结底:没有什么坏处,只会对性能造成(轻微)影响,因为您正在覆盖JPA提供者关于向数据库发送SQL指令的最佳时机的决定。
Copyright © 2013 - 2023 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号: 粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
扫码关注腾讯云开发者
领取腾讯云代金券