玩!框架立即保存?

时间:2011-12-13 11:38:36

标签: jpa playframework

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

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

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

如何强行冲洗或在保存时自动冲洗?

3 个答案:

答案 0 :(得分:15)

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

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

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

}

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

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.
}

如果你在那里启动它,那么你在循环中提交回滚这一点很重要,否则你会遇到太多打开的交易问题不久。

答案 1 :(得分:5)

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

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

答案 2 :(得分:2)

尝试

User.em().flush();

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