2

我的环境:
- 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。

期待您的回答。

问候,安德烈亚斯。

4

0 回答 0