在玩中!如果你这样叫它:
void method()
{
User u = User();
u.name = "bob";
u.save();
while(true){/* endless loop */}
}
实际上不会将任何内容保存到数据库中(播放!类需要拿回手才能刷新保存。)
我必须如何处理才能强制刷新或使其在保存时自动刷新?
发布于 2011-12-13 12:27:01
您的更改在数据库中不可见的原因是事务尚未提交,因此其他事务无法您的更改(至少在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 */}
}
如果你想在无限循环内部或之后访问你的数据库(如果你有一个中断条件),你将不得不begin一个新的事务,否则你会得到来自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.
}
重要的是,在循环中使用commit或rollback事务,如果您在那里启动它,否则很快就会遇到太多打开事务的问题。
发布于 2011-12-13 11:57:59
正如Andrei Bodnarescu所说,您可以使用JPA.em().flush()
或User.em().flush()
显式刷新持久性上下文。
但是,请注意,这样做不会使保存的实体立即可用于其他事务,因为应该首先提交当前事务。您可以将当前事务作为JPA.em().getTransaction().commit()
提交。
发布于 2011-12-13 11:47:02
试一试
User.em().flush();
如果我没记错的话,是默认的播放!模型包含对EntityManager的引用,可以像这样访问它。
https://stackoverflow.com/questions/8488565
复制相似问题