Flash 是做什么的? 我为什么需要使用它?

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

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

EntityManager.flush();的调用将迫使数据立即保持在数据库中,而 EntityManager.persist()不会(取决于 EntityManager 的配置方式: FlushModeType(AUTO 或 COMMIT)默认设置为 AUTO,如果设置为 COMMIT,刷新将自动完成,提交事务时数据对底层数据库的持久性将被延迟)。

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

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

具体的行为取决于刷新模式是 AUTO 还是 COMMIT。

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

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

如果没有 ush () ,这(将实体从 Persistence Context移动到数据库)将在提交与此 Persistence Context相关联的事务时发生。

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

持久化框架通常在幕后管理交易。

EntityManager.flush()总是在持久化框架自动提交事务之前被调用。

EntityManager.persist()只向持久化上下文注册实体,而不向 DB 发送任何 SQL 语句。这意味着在 persist()之后您不会得到自动生成的 ID。您只需要传递持久化对象,最终在后面的 flush()中获得 ID。你可以自己调用 flush()。但同样,它不是交易的结束,所以 它可以回滚,甚至更多: 更改可能被其他事务/线程/进程/服务器看到(通过幽灵读取) ,然后根据 DB 引擎和当前和外部事务的隔离级别,< em > 然后消失!