我的环境:
- RequestFactory(GWT 2.5rc2,在 2.5rc1 和 2.4 之前 - 对问题没有影响)
- Hibernate
- Spring 的 OpenSessionInView 过滤器(每个请求的会话)
我想保留一个基本上具有如下结构的 EntityProxy:
EntityProxy_A
... other properties ...
--> Set<EntityProxy_B setEntProxB;
--> EntityProxy_C entProxC;
--> EntityProxy_D entProxC;
我的请求方法在与我的域类(定位器概念)分开的类中实现。因此我不使用InstanceRequest persist()。
解决方案/问题 1 - 以下方法是否有效:
我有请求方法,例如
Request<EntityProxy_A> save(EntityProxy_A);
Request<EntityProxy_A> createNew();
我使用 createNew() 将 EntityProxy_A 的实例(使用有关“...其他属性...”的值进行初始化,并已保存在数据库中)发送给客户端。重要的是要提到此时没有创建任何 EntityProxy_B 集。
在 createNew() 的 OnSuccess 我做
public void onSuccess(EntityProxy_A response) {
MyRequest request = myRequestFactory.getMyRequest();
EntityProxy_A editableA = request.edit(response);
...
然后我用“请求”创建我的 EntityProxy_B、C、D 并组装所有东西(如上面列出的)。
现在我打电话
request.save(editableA)
.with("setEntProxB",
"setEntProxB.entProxC",
"setEntProxB.entProxD")
.fire(Receiver<EntityProxy_A>() {
@Override
public void onSuccess(EntityProxy_A response) {
.......
}
参数 Entity_A 到达我在服务器上的请求方法 impl 及其所有子节点,然后被持久化,一切都显示在数据库中。
如果我在休眠会话上调用强制刷新(请记住我使用 OpenSessionInView,所以通常在我离开请求方法 impl 后所有内容都会保留)我什至可以看到新创建/持久的 EntityProxy_B、C、D 实例的所有 ID。
当我查看返回给客户端的 JSON 时,我什至可以找到存储为 entProxC 属性的数据,因此我假设对象图已正确构建并发送到客户端。
但是现在在“保存”调用的 OnSuccess 中发生的情况如下
public void onSuccess(EntityProxy_A response) {
MyRequest request = myRequestFactory.getMyRequest();
EntityProxy_A editableA = request.edit(response);
...
在调用“编辑”时,我收到一个错误
“...错误 Unfrozen bean with null RequestContext ...”
,这是因为 EntityProxy_C 和 EntityProxy_D(不是 Set 中的 EntityProxy_B!)返回为“frozen = false”,当然就是这样点也没有请求上下文。当我查看 JSON 时,我看到了 entProxC: {} (那里的一切都是空的 - 没有有效负载)。
我发现Link中记录的正是这种情况,但我在代码中看不到解决方案......只是提到的错误。
现在我的问题 - 我应该能够像那样使用 RequestFactory 吗?
解决方案/问题 2 - 我现在的解决方案,可以像这样使用 requestfactory:
我现在有请求方法,例如
Request<Void> save(EntityProxy_A);
Request<EntityProxy_A> createNew();
像第一种方法一样调用 createNew() 。现在我也有一个实例变量
EntityProxy_A myWorkA;
....
public void onSuccess(EntityProxy_A response) {
MyRequest request = myRequestFactory.getMyRequest();
myWorkA = request.edit(response);
...
然后我对我的“myWorkA”进行编辑,最后。
request.save(myWorkA)
.fire(Receiver<Void>() {
@Override
public void onSuccess(Void response) {
.....
}
在这里,我没有从服务器返回 EntityProxy_A - 无论如何,我想为什么要将所有内容传输回客户端(除了来自持久的 EntityProxy_B、C、D 的新创建的 ID)。因此,当我需要在客户端有一个指向特定 EntityProxy 的指针时,我现在使用 EntityProxy.stableId() ——这可能会更好。
在 OnSuccess 我做
public void onSuccess(Void response) {
MyRequest request = myRequestFactory.getMyRequest();
myWorkA = request.edit(myWorkA);
...
我已经有了我的“myWorkA”,所以为什么不在新的 RequestContext 中使其可编辑并继续编辑并保存并保存并保存...
这对我来说非常有效......我的问题......这是一件好事吗?
当我重新保存我的“myWorkA”时,其中当然还有 NULL 实体 ID,因为我从未从服务器加载最新版本 - 我没有问题,相应的实体在服务器上更新,而不是一遍又一遍地创建(由于 NULL ID 可以猜到)。
如果有人可以澄清一下,为什么解决方案 1 不起作用(或预计不会起作用)以及是否可以像解决方案 2 中所示那样工作。
我剩下的唯一其他方法是有类似的东西:
Request<Void> save(EntityProxy_A);
Request<EntityProxy_A> load(Long entProxId);
Request<EntityProxy_A> createNew();
但我不喜欢那样......交通......
无论如何,现在 - 如果正确使用 RequestFactory - 到目前为止,我更喜欢解决方案 2。
期待您的回答。
问候,安德烈亚斯。