1
こんにちは私のプロジェクトに問題があります。私はバックグラウンドジョブ を実行して、1つのエンティティを更新します。問題は、コントローラから別のエンティティ を更新すると、最初のエンティティが更新されたエンティティ に反応しないということです。私は、コントローラからアクセスしようとした場合でも、第二 エンティティは、私がここで ジョブで制御されていないエンティティが更新されました
はコードだ、それが更新されたことがわかります。 セカンドエンティティ パッケージモデル。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();
}
}
私はそれがこのコントローラ
public static void addMapPoint(int x, int y){
GameMap map =(GameMap) GameMap.findAll().iterator().next();
map.addPoint(x, y, 1);
}
これからappPoint()メソッドを呼び出して更新するには、
パッケージコントローラを更新されない仕事です。
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();
}
}
}
}
}
ありがとう
これは動作しますが、なぜ私は理解できません。 GameMap map =(GameMap)GameMap.findAll()。iterator()。next();データベースから新しいエンティティを取得する必要があります。なぜ手動で更新する必要がありますか? –
@MaurizioPz:Play Frameworkがこれをどのように管理しているのか分かりませんが、基本的なJPAの理解から、 'findAll()'メソッドの呼び出しは同じ永続コンテキスト内で起こるため、ロードされたエンティティはコンテキストによってキャッシュされ、インスタンス。 – axtavt
今、私は理解しています、ありがとう –