2011-05-03 73 views
1

我真的不知道在我的問題在於,正如我在,我不會有太多的經驗兩個方面我嘗試:JPA及期貨(使用播放框架的工作和承諾!)。如何刷新未來的實體?

我有下面的代碼位,我想從另一個HTTP請求返回一個會議對象,當這個對象的領域之一,被賦予了價值,由另一個線程。以下是我有:

Promise<Meeting> meetingPromise = new Job<Meeting>() { 
     @Override 
     public Meeting doJobWithResult() throws Exception { 
      Meeting meeting = Meeting.findById(id); 
      while (meeting.bbbMeetingId == null) { 
       Thread.sleep(1000); 
       meeting = meeting.refresh();  // I tried each of these 
       meeting = meeting.merge();  // lines but to no avail; I 
       meeting = Meeting.findById(id); // get the same result 
      } 
      return meeting; 
     } 
    }.now(); 
    Meeting meeting = await(meetingPromise); 

正如我在評論中指出,有三條線在那裏,其中任何一個,我認爲應該讓我從數據庫中刷新我的對象的內容。從調試器看來,這些調用刷新了多對一關係,但單個值不是。

Meeting對象擴展播放!框架的模式,爲方便起見,這裏是refresh方法:

/** 
* Refresh the entity state. 
*/ 
public <T extends JPABase> T refresh() { 
    em().refresh(this); 
    return (T) this; 
} 

merge方法:

/** 
* Merge this object to obtain a managed entity (usefull when the object comes from the Cache). 
*/ 
public <T extends JPABase> T merge() { 
    return (T) em().merge(this); 
} 

所以,我怎麼能刷新我的模型從數據庫中?

回答

2

所以,我結束了在play-framework組交叉發佈這個問題,我在那裏得到了答案。所以,爲了討論,請查看該線程。

在有答案的網絡搜索的人誰在未來的這個問題,在這裏拿出的興趣是什麼,我在前面貼的代碼片段看起來像:

Promise<Meeting> meetingPromise = new Job<Meeting>() {   
    @Override 
    public Meeting doJobWithResult() throws Exception { 
     Meeting meeting = Meeting.findById(id); 
     while (meeting.bbbMeetingId == null) { 
      Thread.sleep(1000); 
      if (JPA.isInsideTransaction()) { 
       JPAPlugin.closeTx(false); 
      } 
      JPAPlugin.startTx(true); 
      meeting = Meeting.findById(id); 
      JPAPlugin.closeTx(false); 
     } 
     return meeting; 
    } 
}.now(); 
Meeting meeting = await(meetingPromise); 

我不是使用@NoTransaction註釋,因爲這會弄亂一些其他代碼來檢查請求是否來自有效用戶。

0

我不知道這件事,但是JPA交易是由在請求/控制器方面可以發揮自動管理(在JPAPlugin調用之前打開事務和調用後關閉它)。
但我不知道在所有的工作中會發生什麼,我不認爲交易是自動管理(或它的一個功能,我不知道)。那麼,你的實體是附屬於一個實體管理者還是暫時的?某處有交易嗎?我真的不知道,但它可能會解釋一些奇怪的行爲,如果不是...

+0

我相信我的實體與實體管理器關聯,因爲我通過'findById'首先檢索它。但是,我可能會錯過一些東西。有沒有辦法通過調試器或其他方式來說明? – pkaeding 2011-05-04 06:29:18

+0

即使沒有打開的事務,JPA也應該能夠檢索實體,並將其作爲附加實體放入其緩存中。但如果你想修改,什麼時候提交?此外,關係發生了什麼?我不知道......在這些情況下,JPA和休眠變成黑盒子,我不知道用調試器進行分析的任何方式(我可能是無知的:))... IMO,分析播放代碼和發生什麼是最好的解決方案。 – mandubian 2011-05-04 06:46:51