我正在为我的项目使用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);
}
}
}
问题:
请不要错过任何意见。
谢谢。
答案 0 :(得分:2)
使用该外键约束,您必须确保在插入其余内容之前已完成erasync.setProjects(...)。
我建议在(或来自)onsuccess回调中执行erasync.setEntityAttribute(...)
魔术,而不是直接跳转到它。
答案 1 :(得分:0)
由于Async的性质,不要假设在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);
答案 2 :(得分: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 */
}
});
第二个选项很可能不那么混乱,因为几个嵌套的异步回调很快变得非常宽泛和令人困惑,而且你只做了一个请求。