JPA flush vs commit

mon*_*ico 5 java postgresql spring jpa

在JPA中,如果我们调用EntityTransaction.commit(),它会自动调用EntityManager.flush()吗?或者我们应该叫他们俩?有什么不同?因为我有JPA的问题,当我将实体插入数据库时​​,我调用persist().在数据库中,数据已被插入(可以获取),但该数据不会显示在我的应用程序中(我使用findAll()获取它).它出现在另一个实体上.有什么我不知道的吗?我正在使用标准的Spring CRUD,JPA resource_local和postgresql.对不起我的英文,提前谢谢

sin*_*ash 14

如果我们调用EntityTransaction.commit(),它会自动调用EntityManager.flush()吗?

有什么不同?

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

资源


San*_*tra 8

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

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

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


use*_*279 5

如果您的实体中有一个@Version 注释的列并调用 entityManager.flush(),那么您将(立即!)得到一个 OptimisticLockException,或者数据库将锁定该行(或表)。在后一种情况下,您仍然可以调用 setRollbackOnly(),并且稍后将在不更改数据库的情况下释放锁。

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

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

  • 这个答案几乎与问题无关,但无论如何都提供了非常丰富的信息。 (3认同)