玩!框架立即保存?

Fla*_*ken 11 jpa playframework

在玩!如果你这样称呼:

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

实际上没有任何东西会被保存到数据库中(Play!类需要返回以刷新保存.)

我如何进行以强制冲洗或使其在保存时自动冲洗?

Dom*_*orn 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 */}

}
Run Code Online (Sandbox Code Playgroud)

如果你想在无限循环内或之后访问你的数据库(如果你有一个中断条件),你将不得不开始一个新的事务,或者你将从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.
}
Run Code Online (Sandbox Code Playgroud)

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


axt*_*avt 5

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

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