【问题标题】:how we can get JPA EntityManager Flush work我们如何让 JPA EntityManager Flush 工作
【发布时间】: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

【问题讨论】:

    标签: java jpa transactions entitymanager


    【解决方案1】:

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

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

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

    em.getTransaction().commit();
    

    【讨论】:

    • 我还将刷新模式更改为提交而不是自动但没有任何反应
    • 大多数 JPA 实现将在 JVM 内(在 EntityManager 内)缓存操作。 flush() 仅强制将这些操作发送到数据库等 - 但并不意味着提交。 stackoverflow.com/questions/4275111/… 有一些额外的细节/讨论可能对你有帮助。
    • 将刷新模式设置为提交是倒退考虑。这告诉 EntityManager 仅在提交时刷新。这并不意味着在刷新时提交。
    • 这是一个微妙的细节,但提交的刷新模式并不意味着仅在提交时刷新。这意味着总是在提交时刷新;但刷新也可能在其他时间发生,具体取决于 JPA 提供程序。
    猜你喜欢
    • 1970-01-01
    • 2010-11-26
    • 2018-11-29
    • 2013-04-09
    • 2011-11-08
    • 1970-01-01
    • 2010-10-01
    • 2012-12-15
    相关资源
    最近更新 更多