mon*_*ico 5 java postgresql spring jpa
在JPA中,如果我们调用EntityTransaction.commit(),它会自动调用EntityManager.flush()吗?或者我们应该叫他们俩?有什么不同?因为我有JPA的问题,当我将实体插入数据库时,我调用persist().在数据库中,数据已被插入(可以获取),但该数据不会显示在我的应用程序中(我使用findAll()获取它).它出现在另一个实体上.有什么我不知道的吗?我正在使用标准的Spring CRUD,JPA resource_local和postgresql.对不起我的英文,提前谢谢
em.flush() - 它立即将实体保存到数据库中,用于进一步使用的事务中,并且可以回滚。
em.getTransaction().commit - 它标志着事务结束并将事务中的所有更改保存到数据库中,并且不能回滚。
参考https://prismoskills.appspot.com/lessons/Hibernate/Chapter_14_-_Flush_vs_Commit.jsp
如果您的实体中有一个@Version 注释的列并调用 entityManager.flush(),那么您将(立即!)得到一个 OptimisticLockException,或者数据库将锁定该行(或表)。在后一种情况下,您仍然可以调用 setRollbackOnly(),并且稍后将在不更改数据库的情况下释放锁。
或者从不同的角度来看,使用 flush() 您可以在该数据库行上创建一个(悲观的)锁。其他人仍然会看到旧条目,但如果他们尝试更新,他们将被阻止,直到锁定被释放。
所有这些对于 CMT(容器管理事务)也是如此。无需等待服务方法完成并执行 CMT 提交的时刻,您可以在服务方法中调用 flush()(甚至多次)并立即处理 OptimisticLockException(s)。
| 归档时间: |
|
| 查看次数: |
16657 次 |
| 最近记录: |