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)
在循环中提交或回滚事务是很重要的,如果你在那里启动它,否则很快就会遇到太多打开事务的问题.
正如Andrei Bodnarescu所说,您可以使用JPA.em().flush()或User.em().flush()明确刷新持久性上下文.
但请注意,这样做不会使保存的实体立即可用于其他事务,因为应首先提交当前事务.您可以将当前事务提交为JPA.em().getTransaction().commit().
| 归档时间: |
|
| 查看次数: |
5059 次 |
| 最近记录: |