当前位置: 首页 > 知识库问答 >
问题:

JPA刷新与提交

蒋航
2023-03-14

在JPA中,如果我们调用EntityTransaction。commit(),它是否自动调用EntityManager。flush()?或者我们应该叫他们两个?有什么区别?因为我对JPA有问题,当我向数据库插入实体时,我调用persist()。在数据库中,数据已经插入(可以提取),但该数据没有显示在我的应用程序中(我使用findAll()提取)。在另一个实体上,它出现了。有什么我不知道的吗?我使用的是标准Spring CRUD、JPA resource_local和postgresql。对不起我的英语,提前谢谢

共有3个答案

东郭思远
2023-03-14

如果您的实体中有一个带@Version注释的列,请调用entityManager。flush(),则您将(立即!)获取OptimisticLockException,否则数据库将锁定此行(或表)。在后一种情况下,您仍然可以调用setRollbackOnly(),锁稍后将在不更改DB的情况下释放。

或者从另一个角度来看,使用flush()可以在该数据库行上创建(悲观)锁。其他人仍然会看到旧条目,但如果他们尝试更新,他们将被阻止,直到锁被释放。

所有这一切对于CMT(容器管理事务)也是如此。您可以在服务方法中调用flush()(甚至多次),并立即处理OptimisticLockException,而不是等待服务方法完成并执行CMT提交的时刻。

江亮
2023-03-14

em.flush()-它将实体立即保存到数据库中,并在事务中进一步使用,并且可以回滚。

em.getTransaction()。提交-它标志着事务的结束,并将事务中的所有技术保存到数据库中,并且不能回滚。

参考https://prismoskills.appspot.com/lessons/Hibernate/Chapter_14_-_Flush_vs_Commit.jsp

杜俊逸
2023-03-14

如果我们调用EntityTransaction。commit(),它是否自动调用EntityManager。flush()?

有什么区别?

在flush()中,数据的更改在遇到flush后反映在数据库中,但它仍然在transaction.flush()中必须包含在事务上下文中,除非需要(在极少数情况下),否则您不必显式执行此操作,当EntityTransaction.commit()为您执行此操作时。

来源

 类似资料:
  • 问题内容: 在JPA中,如果我们调用EntityTransaction.commit(),它会自动调用EntityManager.flush()吗?还是我们都应该称呼它们?有什么区别?因为我在使用JPA时遇到问题,所以当我向数据库中插入实体时,我会调用persist()。在数据库中,数据已插入(可以获取),但是该数据未显示在我的应用程序中(我使用findAll()进行获取)。在另一个实体上,它出现

  • 问题内容: 如果将新文档索引到Elasticsearch索引,则可在索引操作后1秒钟左右搜索新文档。但是,可以通过调用或对索引进行操作来强制使该文档可立即搜索。这两个操作之间有什么区别- 结果似乎对他们来说是相同的,可以立即搜索文档。 这些操作中的每一项到底是什么? ES文档似乎并未深入解决此问题。 问题答案: 您得到的答案是正确的,但我认为值得详细说明。 刷新有效地调用了Lucene索引读取器上

  • 我将Seam与JPA一起使用(实现为SEAM管理的持久上下文),在我的后台bean中,我将一个实体集合(ArrayList)加载到后台bean中。 如果不同的用户在不同的会话中修改实体之一,我希望这些更改传播到我的会话中的集合,我有一个方法< code>refreshList()并尝试了以下方法... 使用以下查询 重新执行查询,只返回我已经拥有的相同数据(我假设它使用的是一级缓存,而不是数据库)

  • 我想在3个表中插入记录。代码如下。 地址的密钥是aID,客户的密钥是cID。它们是自动增量。在顾客中,有一个外键受地址的aID约束。HomeCu的外键cID受客户的cID约束。所以我想插入地址,客户,HomeCu顺序,在此期间,我必须得到密钥而不做提交。我使用flush()来获取密钥,但在提交操作中失败。为什么在提交操作中,像电子邮件、密码这样的值变成无,但打印语句做得很好?我已经为此挣扎了几个小

  • 问题内容: 当按下发送按钮而字段中没有任何数据时,如何防止页面刷新? 验证设置工作正常,所有字段均变为红色,但随后页面立即刷新。我对JS的知识比较基础。 我特别认为底部的功能是“不良”。 的HTML JS 问题答案: 您可以阻止表单提交 当然,在该函数中,您可以检查是否有空白字段,如果看起来不正确,将停止提交。 没有jQuery:

  • 问题内容: 有人可以告诉我使用 jquery来显示成功提交表单 而不刷新页面 的教程。传递邮件时,在gmail上会发生类似的事情,黄色的叠加层显示邮件已传递,然后淡出。 我希望根据表单提交的结果显示消息。 问题答案: 好的…类似这样的东西…但是我没有尝试过…所以像教程一样使用它。您也可以使用json js: HTML: form_process.php