我们如何让 JPA EntityManager Flush 工作

Posted

技术标签:

【中文标题】我们如何让 JPA EntityManager Flush 工作【英文标题】:how we can get JPA EntityManager Flush work 【发布时间】:2012-02-10 10:23:25 【问题描述】:

我的问题是为什么刷新不起作用:

public void ejbService()
   Customer c = em.find(Customer.class,1);
   c.setName("newName");
   em.flush();
   //at this point when I query mysql table I can not see "newName"


   thread.sleep(10000);

   c.setName("anotherName");

完成方法后,我在数据库中看到“anotherName” 我也用 em.find(Customer.class,1,Lock.None);但还是不行

RGDS

【问题讨论】:

【参考方案1】:

您正在刷新,但您没有提交 - 或以其他方式结束可能配置为自动提交的事务/会话。

是的,在调用flush() 之后,DBMS 现在知道您的数据 - 但按照 ACID 标准,在 DBMS 被告知提交之前,其他数据库会话不会看到这些数据。

在不了解应用程序其余部分背后的架构等其他详细信息的情况下,您可能希望执行以下操作:

em.getTransaction().commit();

【讨论】:

我还将刷新模式更改为提交而不是自动但没有任何反应 大多数 JPA 实现将在 JVM 内(在 EntityManager 内)缓存操作。 flush() 仅强制将这些操作发送到数据库等 - 但并不意味着提交。 ***.com/questions/4275111/… 有一些额外的细节/讨论可能对你有帮助。 将刷新模式设置为提交是倒退考虑。这告诉 EntityManager 仅在提交时刷新。这并不意味着在刷新时提交。 这是一个微妙的细节,但提交的刷新模式并不意味着仅在提交时刷新。这意味着总是在提交时刷新;但刷新也可能在其他时间发生,具体取决于 JPA 提供程序。

以上是关于我们如何让 JPA EntityManager Flush 工作的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 EntityManager (JPA) 在 DAO 中实现 update() 方法?

使用 JPA EntityManager 进行批量插入

如何从 Grails 服务 (JPA + GAE) 中访问 EntityManager

如何使用 Hibernate (EntityManager) 或 JPA 调用 Oracle 函数或过程

如何设置 JPA EntityManager 查询的超时时间

保持 JPA EntityManager 打开?