答案 0 :(得分:10)
如果我们调用EntityTransaction.commit(),它会自动调用吗? EntityManager.flush()?
是
有什么区别?
在flush()中,数据的更改在遇到flush后反映在数据库中,但它仍然在transaction.flush()中必须包含在事务上下文中,你不必明确地做,除非需要(在极少数情况下),当EntityTransaction.commit()为你做这件事。
答案 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