我们如何让 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() 方法?
如何从 Grails 服务 (JPA + GAE) 中访问 EntityManager
如何使用 Hibernate (EntityManager) 或 JPA 调用 Oracle 函数或过程