1

我在我的项目中使用 gwt 和 postgres。在前端,当我单击“保存项目”按钮时,我试图将其数据保存到后端的表中(这也是创建项目的名称)。

在异步回调部分,我设置了多个表。但它没有正确发送数据。我收到以下错误:

org.postgresql.util.PSQLException: ERROR: insert or update on table "entitytype" violates foreign key constraint "entitytype_pname_fkey"
  Detail: Key (pname)=(Project Name) is not present in table "project".

但是当我在项目表上执行选择语句时,我可以看到项目名称存在。

回调部分如下所示:

        oksave.addClickHandler(new ClickHandler(){
                            @Override
                            public void onClick(ClickEvent event) {
                                if(erasync == null)
                                    erasync = GWT.create(EntityRelationService.class);
                                AsyncCallback<Void> callback = new AsyncCallback<Void>(){
                                    @Override
                                    public void onFailure(Throwable caught) {
                                        }

                                    @Override
                                    public void onSuccess(Void result){  }                          
                        };      
    erasync.setProjects(projectname, callback);

                                for(int i = 0; i < boundaryPanel.getWidgetCount(); i++){

                                    top = new Integer(boundaryPanel.getWidget(i).getAbsoluteTop()).toString();
                                    left = new Integer(boundaryPanel.getWidget(i).getAbsoluteLeft()).toString();
                                    if(widgetTitle.startsWith("ATTR")){
                                        type = "regular";

                                            erasync.setEntityAttribute(name1, name, type, top, left, projectname, callback);
                                        }   else{
erasync.setEntityType(name, top, left, projectname, callback);
}                           
                                    }
    }

问题:

  1. 在所有其他表都依赖于特定表的异步回调中设置多个是否错误?
  2. 当我在上面的代码中说 setProjects 时,它不是先完成然后移动到下一个吗?

请任何输入将不胜感激。

谢谢你。

4

3 回答 3

2

使用该外键约束,您必须确保 erasync.setProjects(...) 在插入其余内容之前已完成。

我建议 erasync.setEntityAttribute(...)在(或从)onsuccess 回调中施展魔法,而不是直接跳到它。

于 2010-03-16T07:26:22.963 回答
0

由于异步的性质,不要假设setProjects(...)方法会在setEntityAttribute或之前在服务器上调用setEntityType

就个人而言,我更喜欢有一个Project包含所有必要信息的类,例如:

public class Project{  
      private String projectName;  
      private List attributes = new ArrayList();  
      .. other properties  

  // Getter & Setter methods  
}

然后在一次往返中发送到服务器:

Project project = new Project();  
project.setProjectName(..);  
// Set other properties  
erasync.saveProjects(project, callback);
于 2010-03-17T02:17:50.583 回答
0

您正在触发几个请求,其中(从错误消息中猜测)确实应该按顺序调用。

任何时候调用多个 rpc 调用;尝试认为您应该能够以任何顺序重新排列它们(因为这几乎是实际发生的事情,因为它们是异步的)......如果以相反的顺序运行它们没有意义;你不能按顺序开火!

解决问题的两种方法:

嵌套:

    service.callFirst(someData, new AsyncCallback<Void> callback = new AsyncCallback<Void>(){
        @Override
        public void onFailure(Throwable caught) {/*Handle errors*/}
        @Override
        public void onSuccess(Void result){
            service.callSecond(someOtherData, new AsyncCallback<Void> callback = new AsyncCallback<Void>(){ 
                /* onSuccess and onFailure for second callback here */ 
            });
        }                       
    });

或者创建一个同时执行这两种操作的服务调用(推荐):

    service.callFirstAndSecond(someData, someOtherData, new AsyncCallback<Void> callback = new AsyncCallback<Void>(){
        @Override
        public void onFailure(Throwable caught) {/*Handle errors*/}
        @Override
        public void onSuccess(Void result){
            /* Handle success */
        }                       
    });

第二个选项很可能不会那么混乱,因为几个嵌套的异步回调很快就会变得非常广泛和混乱,而且你只提出一个请求。

于 2010-03-17T15:08:01.267 回答