在游戏中!如果你这样称呼:
void method()
{
User u = User();
u.name = "bob";
u.save();
while(true){/* endless loop */}
}
实际上不会将任何内容保存到数据库中(Play!类需要返回以刷新保存。)
如何强行冲洗或在保存时自动冲洗?
答案 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的引用,可以像这样访问它。