EntityManager.flush做了什么以及为什么需要使用它?

spa*_*kus 58 java jpa entitymanager

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

if (somecondition) {
    entityManager.persist(unAttachedEntity);
} else {
    attachedEntityObject.setId(unAttachedEntity.getId());
}
entityManager.flush();
Run Code Online (Sandbox Code Playgroud)

Ben*_*chi 47

调用EntityManager.flush();将强制数据立即保留在数据库中EntityManager.persist()(取决于EntityManager的配置方式:默认情况下,FlushModeType(AUTO或COMMIT)设置为AUTO,如果设置为自动则刷新将自动完成当提交事务时,COMMIT将数据的持久性延迟到底层数据库).

  • "FlushModeType"的描述不正确:基本上AUTO意味着如果您更改实体并且之后进行可能返回该实体的SELECT查询,则AUTO将强制在SELECT执行之前刷新对该实体的更改. (9认同)

Sac*_*apa 17

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

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

具体行为取决于flush-mode是AUTO还是COMMIT.


小智 17

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

  • 在提交事务之前,可以使用EntityManager.flush()操作对数据库进行写入所有更改. - >这不完全正确.您仍然需要提交,flush只会将SQL语句发送到数据库而不提交.触发刷新,没有提交仍然不会实际插入任何实体.如果你还没有刷新,commit会为你刷新,但flush不会提交.. (4认同)
  • EntityManager.flush()会将数据发送到数据库,但此时其他人不会看到它.相反,更改的数据库条目将获得行锁定.但只有在commit()之后,其他人才能看到更改,并且会删除锁定. (3认同)
  • @ user2081279实际上,确切的语义取决于有效的事务隔离设置:每个数据库的默认设置各不相同,并且大多数数据库提供了各种可能的设置。 (2认同)

gav*_*koa 14

EntityManager.flush()将实际的 SQL 命令发送到 DB。

持久性框架通常在后台管理事务。因此不能保证刷新的查询会成功提交

EntityManager.flush()始终在持久性框架在后台自动提交事务之前调用。

EntityManager.persist()仅将实体注册到持久化上下文,而不向数据库发送任何 SQL 语句。这意味着您将不会在 后获得自动生成的 ID persist()。您只需传递持久化对象,最终flush()它就会获得 ID。您可以致电flush()自己提前获取这些 ID。但同样,这不是事务的结束,因此它可以回滚,甚至更多:其他事务/线程/进程/服务器可能会看到更改(通过幻像读取),然后根据数据库引擎和当前和的隔离级别而消失。国外交易!


Aru*_*run 10

因此,当您调用时EntityManager.persist(),它只会使实体受到管理EntityManager并将其添加(实体实例)Persistence Context.显式flush()将使现在驻留在实体中的实体Persistence Context移动到数据库(使用SQL).

如果没有flush(),那么(将实体从Persistence Context数据库移动到数据库)将在Persistence Context提交与之关联的Transaction时发生.