2011-05-03 68 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