GWT with JDO problem
- by Maksim
I just start playing with GWT I'm having a really hard time to make GWT + JAVA + JDO + Google AppEngine working with DataStore.
I was trying to follow different tutorial but had no luck. For example I wend to these tutorials: TUT1 TUT2
I was not able to figure out how and what i need to do in order to make this work.
Please look at my simple code and tell me what do i need to do so i can persist it to the datastore:
1. ADDRESS ENTITY
package com.example.rpccalls.client;
import java.io.Serializable;
import javax.jdo.annotations.IdGeneratorStrategy;
import javax.jdo.annotations.Persistent;
import javax.jdo.annotations.PrimaryKey;
public class Address implements Serializable{
    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    private int addressID;
    @Persistent private String address1;
    @Persistent private String address2;
    @Persistent private String city;
    @Persistent private String state;
    @Persistent private String zip;
    public Address(){}
    public Address(String a1, String a2, String city, String state, String zip){
    	this.address1 = a1;
    	this.address2 = a2;
    	this.city = city;
    	this.state = state;
    	this.zip = zip;
    }
    /* Setters and Getters */
}
2. PERSON ENTITY
package com.example.rpccalls.client;
import java.io.Serializable;
import java.util.ArrayList;
import javax.jdo.annotations.IdGeneratorStrategy;
import javax.jdo.annotations.PersistenceCapable;
import javax.jdo.annotations.Persistent;
import javax.jdo.annotations.PrimaryKey;
import com.google.appengine.api.datastore.Key;
@PersistenceCapable
public class Person implements Serializable{
    @PrimaryKey
    @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
    private Key key;
    @Persistent private String name;
    @Persistent private int age;
    @Persistent private char gender;
    @Persistent ArrayList<Address> addresses;
    public Person(){}
    public Person(String name, int age, char gender){
    	this.name = name;
    	this.age = age;
    	this.gender = gender;
    }
    /* Getters and Setters */
}
3. RPCCalls
package com.example.rpccalls.client;
import java.util.ArrayList;
import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.TextBox;
public class RPCCalls implements EntryPoint {
    private static final String SERVER_ERROR = "An error occurred while attempting to contact the server. Please check your network connection and try again.";
    private final RPCCallsServiceAsync rpccallService = GWT.create(RPCCallsService.class);
    TextBox nameTxt = new TextBox();
    Button btnSave = getBtnSave();
    public void onModuleLoad() {
    	RootPanel.get("inputName").add(nameTxt);	
    	RootPanel.get("btnSave").add(btnSave);
    }
    private Button getBtnSave(){
    	Button btnSave = new Button("SAVE");
    	btnSave.addClickHandler(
    			new ClickHandler(){
    				public void onClick(ClickEvent event){
    					saveData2DB(nameTxt.getText());
    				}
    			}	
    	);
    	return btnSave;
    }
    void saveData2DB(String name){		
    	AsyncCallback<String> callback = new AsyncCallback<String>() {
    		public void onFailure(Throwable caught) {
    	        Window.alert("WOOOHOOO, ERROR: " + SERVER_ERROR);