【问题标题】:Play! framework immediate save?玩!框架立即保存?
【发布时间】:2011-12-13 11:38:36
【问题描述】:

在游戏中!如果你这样称呼:

void method()
{
User u = User();
u.name = "bob";
u.save();
while(true){/* endless loop */}
}

实际上不会将任何内容保存到数据库中(Play! 类需要收回手来刷新保存。)

我必须如何进行才能强制刷新或使其在保存时自动刷新?

【问题讨论】:

  • 您能告诉我们您的用例吗?因为大多数时候这是一个坏主意。
  • 其实我从不调用 while(true){};但是当我在该方法中进行了非常大的导入时,最后一个人最近放弃了手(这导致长期以来没有数据库更改)。用这种方式写的问题要短得多,而且预期的答案是一样的。
  • 听起来你最好触发一些工作并使用 ajax 向用户提供反馈。
  • 没错,实际上它已经在工作了。然后我运行 importer.now();启动进程。导入需要几个小时……我只需要每月执行一次,并查看日志是否一切正常。

标签: jpa playframework


【解决方案1】:

您的更改在数据库中不可见的原因是事务尚未提交,因此其他事务无法看到您的更改(至少在像 PostgreSQL 这样的良好数据库中,甲骨文、MSSQL、DB2)。 为了让您的更改可见,您必须在事务进入无限循环之前提交事务,如下所示:

void method()
{
    User u = User();
    u.name = "bob";
    u.save();
    JPA.em().flush();
    JPA.em().getTransaction().commit();

    while(true){/* endless loop */}

}

如果您想在无限循环内或之后访问您的数据库(如果您有中断条件),您必须开始一个新事务,否则您会从休眠中获得异常.这样做

void method()
{
    User u = User();
    u.name = "bob";
    u.save();
    JPA.em().flush();
    JPA.em().getTransaction().commit();

    while(true){
      // do some stuff

      /* TRANSACTIONAL BLOCK BEGINS */
      JPA.em().getTransaction().begin();
      try{
          // do some stuff
          // fetching, updating, deleting, whatever

          JPA.em().getTransaction().commit();
      }
      catch (Exception e)
      {
          // if an error occurs, rollback the transaction
          JPA.em().getTransaction().rollback();
      }
      /* TRANSACTIONAL BLOCK ENDS */
      // do some other stuff
    }
   // copy the TRANSACTIONAL BLOCK from above, if you want to do stuff after the "infinite loop" as well.
}

重要的是你要么在循环中提交回滚事务,如果你在那里启动它,否则你会遇到太多打开的事务的问题很快。

【讨论】:

  • 是的,除了无限循环。另外,我相信那里的2个答案已经足够清楚了。我不认为您需要在不同的答案中(糟糕地)重新总结它们
  • 感谢您的评论 - 我已经改进了答案。
【解决方案2】:

正如 Andrei Bodnarescu 所说,您可以使用 JPA.em().flush()User.em().flush() 显式刷新持久性上下文。

但是请注意,这样做不会使保存的实体立即可用于其他事务,因为应首先提交当前事务。您可以将当前事务提交为JPA.em().getTransaction().commit()

【讨论】:

    【解决方案3】:

    试试

    User.em().flush();
    

    如果我没记错的话,默认播放! model 持有对 EntityManager 的引用,可以像这样访问它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-09
      • 2012-12-06
      相关资源
      最近更新 更多