gwt - RequestFactory用法,返回的EntityProxy中缺少内容

时间:2012-10-06 22:34:48

标签: gwt

我的环境:
- RequestFactory(GWT 2.5rc2,在2.5rc1和2.4之前 - 对于这个问题没有任何区别)
- 休眠
- 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的实例(使用关于“...其他属性...”的值初始化并且已经在数据库中持久化)到客户端。重要的是,此时不会创建Set of EntityProxy_B。

在createNew()的OnSuccess中我做

 public void onSuccess(EntityProxy_A response) {
   MyRequest request = myRequestFactory.getMyRequest();
   EntityProxy_A editableA = request.edit(response);
   ...

然后我用“request”创建我的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在服务器及其所有子节点,然后持久化,所有内容都显示在db中。

如果我在hibernate会话上调用强制刷新(记住我使用的是OpenSessionInView,所以通常在我离开请求方法impl之后一切都是持久的)我甚至可以看到EntityProxy_B,C的新创建/持久化实例的所有ID ,d。

当我查看返回给客户端的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 - 无论如何我想为什么要将所有内容传回客户端(除了新创建的ID来自持久化的EntityProxy_B,C,D)。因此,当我需要在客户端有一个指向特定EntityProxy的指针时,我现在使用EntityProxy.stableId() - 这可能无论如何更好。

在OnSuccess中我做

 public void onSuccess(Void response) {
   MyRequest request = myRequestFactory.getMyRequest();
   myWorkA = request.edit(myWorkA);
   ...

我已经使用了“myWorkA”,为什么不在新的RequestContext中编辑它并继续编辑并保存并保存并保存...

这对我来说非常有用......我的问题是......这是一件好事吗?

当我重新保存我的“myWorkA”时,其中当然还有NULL实体ID,因为我从未从服务器加载过最新版本 - 我没有问题,相应的entites更新了服务器而不是一遍又一遍地创建(因为可能因为NULL ID而被猜到)。

如果有人可以请清理,为什么解决方案1不起作用(或预计不会起作用),如果可以像解决方案2中所示那样工作。

我唯一剩下的方法就是:

Request<Void> save(EntityProxy_A);  
Request<EntityProxy_A> load(Long entProxId);  
Request<EntityProxy_A> createNew();

但我不喜欢那种......交通......

目前无论如何 - 如果这是对RequestFactory的正确使用 - 到目前为止我更喜欢解决方案2。

期待您的回答。

问候,安德烈亚斯。

0 个答案:

没有答案