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将数据的持久性延迟到底层数据库).
Sac*_*apa 17
EntityManager.persist()使实体持久化,而EntityManager.flush()实际上在您的数据库上运行查询.
因此,当您调用时EntityManager.flush(),在数据库中执行插入/更新/删除关联实体的查询.此时将知道任何约束失败(列宽,数据类型,外键).
具体行为取决于flush-mode是AUTO还是COMMIT.
小智 17
在EntityManager.flush()提交事务之前,可以使用该操作对数据库进行写入所有更改.默认情况下,JPA通常不会在提交事务之前将更改写入数据库.这通常是可取的,因为它避免了数据库访问,资源和锁定,直到需要.它还允许对数据库写入进行排序和批处理以实现最佳数据库访问,并保持完整性约束并避免死锁.这意味着当您调用persist,merge或删除数据库DML INSERT时UPDATE,DELETE不会执行,直到提交,或直到触发刷新.
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时发生.
| 归档时间: |
|
| 查看次数: |
102999 次 |
| 最近记录: |