在Job中未更新的受控对象中更新的实体

时间:2011-01-31 10:30:06

标签: java multithreading jpa playframework

嗨,我的项目有问题。我有一份背景工作 运行更新一个实体。问题是,如果我更新 来自控制器的另一个实体,第一个不响应 更新的实体。但是,如果我尝试从控制器访问第二个 实体我可以看到它已更新,

这是代码: 第二实体 包模型;

import javax.persistence.Entity;

import play.db.jpa.Model;
@Entity
public class GameMap extends Model {
    static int convPx=16;   //converts game pixels in the map rap.
    int[][] array;
    public GameMap(int[][] array) {
        this.array=array;
    }

    public boolean isSolid(int x,int y){
        try{
        if (array[y][x]==0)
            return false;
        else
            return true;
        }catch(Exception e){
            return true;
        }
    }
    public String collides(GameObject object){      //TODO fix if it collides top and left scenario
        if(isSolid((object.x+object.width/2)/convPx,object.y/convPx))
            return "top";
        if(isSolid((object.x+object.width/2)/convPx,(object.y+object.height)/
convPx))
            return "bottom";
        if(isSolid((object.x)/convPx,(object.y+object.height/2)/convPx))
            return "left";
        if(isSolid((object.x+object.width)/convPx,(object.y+object.height/2)/
convPx))
            return "right";
        else
            return "false";
    }

    public void addPoint(int x, int y, int what) {
        array[x/convPx][y/convPx]=what;
        this.save();
    }
}

我更新它从这个控制器调用appPoint()方法

public static void addMapPoint(int x, int y){
            GameMap map =(GameMap) GameMap.findAll().iterator().next();
            map.addPoint(x, y, 1);

    } 

这是未更新的作业

包控制器;

import java.util.Iterator;
import java.util.List;

import models.Ball;
import models.GameMap;
import play.jobs.Job;

public class BallJob extends Job {
    public void doJob() {
        List<Ball> balls;
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        new Ball(40,40,4,4,10,10).save();
        int[][] mapArr = {

{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},

{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},

{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},

{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},

{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},

{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},

{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},

{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},

{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},

{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},

{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},

{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},

{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},

{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},

{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},

{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},

{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},

{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},

{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},

{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},

{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},

{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},

{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},

{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},

{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},

{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},

{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},

{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},

{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}
        };
        GameMap m= new GameMap(mapArr);
        m.save();
        Long time = System.currentTimeMillis();
        while (true){
        try {
            if(25-System.currentTimeMillis()+time>0){
                Thread.sleep(25-System.currentTimeMillis()+time);
            }
                time =System.currentTimeMillis();
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        balls = Ball.findAll();
/***************************************************************
****************************************************************
* This map doesn't change
****************************************************************
***************************************************************/
        GameMap map = (GameMap) GameMap.findAll().iterator().next();

        for (Iterator iterator = balls.iterator();
iterator.hasNext();) {
            Ball ball = (Ball) iterator.next();
            ball.applyForces();
            if(ball.collides(map)){
            ball.applyForces();
            }

        }
        }
    }

} 

有什么想法吗? 谢谢

1 个答案:

答案 0 :(得分:1)

JPA不会将更改从数据库传播到现有实体到持久性上下文。我想你需要刷新它:

map.refresh();