在玩!如果你这样称呼:
void method()
{
User u = User();
u.name = "bob";
u.save();
while(true){/* endless loop */}
}
实际上没有任何东西会被保存到数据库中(Play!类需要拿回手来刷新保存。)
我必须如何进行才能强制刷新或使其在保存时自动刷新?
最佳答案
您的更改在数据库中不可见的原因是该事务尚未提交,因此其他事务无法提交 见 您的更改(至少在像 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 */}
}
如果你想在无限循环内或之后访问你的数据库(如果你有中断条件),你必须开始 一个新的事务,否则你会从休眠中得到异常。这样做
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.
}
重要的是你要么提交 或 回滚 循环中的事务,如果你在那里开始它,否则你很快就会遇到太多未结事务的问题。
关于jpa - 玩!框架立即保存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8488565/