gpt4 book ai didi

java - 如何在未来刷新实体?

转载 作者:行者123 更新时间:2023-11-30 05:03:33 25 4
gpt4 key购买 nike

我不太确定我的问题出在哪里,因为我正在两个我没有太多经验的领域进行试验:JPA 和 Futures(使用 Play! Framework 的 Jobs 和 Promises)。

我有以下代码,当另一个 HTTP 请求的另一个线程为该对象的一个​​字段赋予值时,我想返回一个 Meeting 对象。这是我所拥有的:

    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);

正如我在评论中指出的,其中有三行,我认为其中的任何一行都应该允许我从数据库刷新对象的内容。从调试器来看,这些调用似乎刷新了多对一关系,但单个值却没有。

我的 session 对象扩展了Play!框架的模型,为了方便起见,这里是 refresh 方法:

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

合并方法:

/**
* 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);
}

那么,如何从数据库刷新我的模型?

最佳答案

所以,我最终将这个问题交叉发布到 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 注释,因为这会弄乱一些其他检查请求是否来自有效用户的代码。

关于java - 如何在未来刷新实体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5865660/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com