JPA flush vs commit

时间:2015-02-08 10:09:05

标签: java spring postgresql jpa

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

3 个答案:

答案 0 :(得分:10)

  

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

  

有什么区别?

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

Source

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

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

em.getTransaction()。commit -它标记事务结束,并将事务中的所有变更保存到数据库中,并且无法回滚。

引用https://prismoskills.appspot.com/lessons/Hibernate/Chapter_14_-_Flush_vs_Commit.jsp