我真的不知道在我的问题在于,正如我在,我不会有太多的经验两个方面我尝试: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);
}
所以,我怎么能刷新我的模型从数据库中?
我相信我的实体与实体管理器关联,因为我通过'findById'首先检索它。但是,我可能会错过一些东西。有没有办法通过调试器或其他方式来说明? – pkaeding 2011-05-04 06:29:18
即使没有打开的事务,JPA也应该能够检索实体,并将其作为附加实体放入其缓存中。但如果你想修改,什么时候提交?此外,关系发生了什么?我不知道......在这些情况下,JPA和休眠变成黑盒子,我不知道用调试器进行分析的任何方式(我可能是无知的:))... IMO,分析播放代码和发生什么是最好的解决方案。 – mandubian 2011-05-04 06:46:51