2011-01-31 14 views
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(); 
      } 

     } 
     } 
    } 

} 

ありがとう

答えて

1

JPAはデータベースから既存のエンティティへの変更を永続コンテキストに伝播しません。私はあなたがそれをリフレッシュする必要があると思います:

map.refresh(); 
+0

これは動作しますが、なぜ私は理解できません。 GameMap map =(GameMap)GameMap.findAll()。iterator()。next();データベースから新しいエンティティを取得する必要があります。なぜ手動で更新する必要がありますか? –

+0

@MaurizioPz:Play Frameworkがこれをどのように管理しているのか分かりませんが、基本的なJPAの理解から、 'findAll()'メソッドの呼び出しは同じ永続コンテキスト内で起こるため、ロードされたエンティティはコンテキストによってキャッシュされ、インスタンス。 – axtavt

+0

今、私は理解しています、ありがとう –

関連する問題