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".

しかし、プロジェクトテーブルでselectステートメントを実行すると、プロジェクト名が存在することがわかります。

コールバック部分は次のようになります。

        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(...)成功したコールバックに直接ジャンプするのではなく、成功したコールバックで(またはそこから)魔法をかけることをお勧めし ます。

于 2010-03-16T07:26:22.963 に答える
0

Asyncの性質上、またはsetProjects(...)の前にサーバーでメソッドが呼び出されると想定しないでください。setEntityAttributesetEntityType

個人的には、Project必要なすべての情報を含むクラスを作成することを好みます。たとえば、次のようになります。

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

  // Getter & Setter methods  
}

次に、1回のラウンドトリップでサーバーに送信します。

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

(エラーメッセージから推測して)実際に順番に呼び出される必要があるいくつかのリクエストを実行しています。

複数のrpc呼び出しを呼び出すときはいつでも; それらを任意の順序で再配置できるはずだと考えてみてください(非同期であるため、実際に発生するのはほとんどの場合です)...逆の順序で実行しても意味がない場合。順番に発射することはできません!

問題を解決する2つの方法:

ネスト:

    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 */ 
            });
        }                       
    });

または、両方を実行する1つのサービス呼び出しを作成します(推奨):

    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 */
        }                       
    });

2番目のオプションは、ネストされた非同期コールバックがすぐに非常に広くなり、混乱を招くため、面倒が少なくなる可能性が高くなります。また、リクエストを1つだけ行うこともできます。

于 2010-03-17T15:08:01.267 に答える