EntityManager.flush是做什么的,为什么我需要使用它?

我有一个EJB,我正在将一个对象保存到数据库。 在我看到的一个例子中,一旦保存了这个数据(EntityManager.persist),就会调用EntityManager.flush(); 为什么我需要这样做? 我正在保存的对象不会附加在方法的后面使用。 事实上,一旦保存方法返回,我希望资源被释放。 (示例代码也在删除调用中执行此操作。)

if (somecondition) entityManager.persist(unAttachedEntity); else { attachedEntityObject.setId(unAttachedEntity.getId()); } entityManager.flush(); 

调用EntityManager.flush(); 将强制数据立即保存在数据库中,因为EntityManager.persist()不会(取决于如何configurationEntityManager: FlushModeType (AUTO或COMMIT)默认情况下它被设置为AUTO,并且刷新将自动完成设置为COMMIT时,将会延迟事务提交时数据对基础数据库的依赖)。

可以使用EntityManager.flush()操作在提交事务之前将所有更改写入数据库。 默认情况下,在事务提交之前,JPA通常不会将更改写入数据库。 这通常是可取的,因为它避免了数据库访问,资源和locking,直到需要。 它还允许对数据库写入进行sorting,并进行批处理以实现最佳数据库访问,并保持完整性约束并避免死锁。 这意味着当你调用持久化,合并或者删除数据库时,DML INSERT,UPDATE,DELETE不会被执行,直到commit,或者直到刷新被触发。

EntityManager.persist()使实体持久化,而EntityManager.flush()实际上在数据库上运行查询。

因此,当您调用EntityManager.flush() ,将在数据库中执行插入/更新/删除关联实体的查询。 任何约束失败(列宽度,数据types,外键)将在此时被知道。

具体行为取决于flush模式是AUTO还是COMMIT。

所以当你调用EntityManager.persist() ,它只会让EntityManagerpipe理实体,并将它(实体实例)添加到Persistence Context 。 显式flush()将使得现在驻留在Persistence Context的实体移动到数据库(使用SQL)。

如果没有flush(),当Persistence Context关联的事务被提交时,这个事件(将实体从Persistence Context移动到数据库)将会发生。