我的环境:
- 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。
期待您的回答。
问候,安德烈亚斯。