Thanks for the info. I looked at the issue and many other people having problem of saving child object in a one-to-many relation. I am new to this and I don't understand completely. Is there any work- around to save a child object. If anyone can show me an example, I appreciate. This is really frustrating as this is basic functionality in any relational data. In my case, Employee object already exists and I want to create a new appointment and associate with the employee object. If there is a different way of doing this, please help. This has taken quite a lot of time and if this is not available in GWT, I don't think I can use Google apps for the development of our application. I appreciate any help.
Thanks, Ravi On Aug 27, 1:51 am, Frederik Pfisterer <pfiste...@gmail.com> wrote: > Your problem seems to be related to this open gwt > issue:http://code.google.com/p/google-web-toolkit/issues/detail?id=4976 > > Please star the issue to raise its attention. The workaround is not > using 1:n relationships with GWT + GAE + JDO. > > Cheers, > Fred > > On 26 Aug., 23:12, hampole <rhamp...@gmail.com> wrote: > > > I am trying to develop GAE application. I am using the latest GWT > > SDK(2.0.4) AND App Engine SDK(1.3.6) on Eclipse3.4. I am having > > problem insavinga childobject"Appointment" and the parentobject > > is "Employee". Each Employee has many appointments and and each > > appointment has one employee associated with. I have pasted the Client > > code and the server code here. Please help and see what I am missing > > here. I tried many different ways without success. When I retrieve the > > appointments, the employee is always null. I appreciate any help or > > some example that I can try. Thanks. > > > //Client code > > public class AppointmentCreateWidget extends Composite { > > > private static AppointmentCreateWidgetUiBinder uiBinder = GWT > > .create(AppointmentCreateWidgetUiBinder.class); > > > interface AppointmentCreateWidgetUiBinder extends > > UiBinder<Widget, AppointmentCreateWidget> { > > } > > > @UiField Button btnSaveAppointment; > > @UiField TextBox tbxSubject; > > @UiField ListBox lbxRoom; > > @UiField ListBox lbxHost; > > @UiField DateBox dbAppointStartDate; > > @UiField DateBox dbAppointEndDate; > > @UiField ListBox lbxStartTimeHr; > > @UiField ListBox lbxEndTimeHr; > > @UiField ListBox lbxStartTimeMi; > > @UiField ListBox lbxEndTimeMi; > > > private final AppointmentServiceAsync appointService = > > (AppointmentServiceAsync) GWT.create(AppointmentService.class); > > private final List<Visitor> visitors = new ArrayList<Visitor>(); > > > public AppointmentCreateWidget() { > > initWidget(uiBinder.createAndBindUi(this)) > > } > > > @UiHandler("btnSaveAppointment") > > void onClick(ClickEvent e) { > > addAppointment(); > > } > > > private void addAppointment() { > > String subject = tbxSubject.getText().toUpperCase().trim(); > > Date startdate = dbAppointStartDate.getValue(); > > Date enddate = dbAppointEndDate.getValue(); > > String starttime = > > lbxStartTimeHr.getValue(lbxStartTimeHr.getSelectedIndex()).toString() > > + > > lbxStartTimeMi.getValue(lbxStartTimeMi.getSelectedIndex()); > > String endtime = > > lbxEndTimeHr.getValue(lbxEndTimeHr.getSelectedIndex()).toString() + > > lbxEndTimeMi.getValue(lbxEndTimeMi.getSelectedIndex()); > > String room = > > lbxRoom.getValue(lbxRoom.getSelectedIndex()).toString(); > > String key = lbxHost.getValue(lbxHost.getSelectedIndex()); > > DateTimeFormat dateFormat = DateTimeFormat.getShortDateFormat(); > > > try { > > createAppointment(subject, startdate, enddate, > > starttime, > > endtime, key, visitors); > > } > > catch(Exception ex) { > > Window.alert("Save Appointment failed: " + ex.toString()); > > } > > } > > > private void createAppointment(String subject, Date startdate, Date > > enddate, String starttime, String endtime, String empID, List<Visitor> > > visitor) { > > appointService.addAppointment(subject,startdate, enddate, > > starttime, endtime, empID, visitor, new AsyncCallback<Void>() { > > public void onFailure(Throwable error) { > > Window.alert("Unable to create Appointment." + > > error.getMessage()); > > } > > public void onSuccess(Void ignore) { > > } > > }); > > } > > > } > > > //ServiceImpl > > public class AppointmentServiceImpl extends RemoteServiceServlet > > implements AppointmentService { > > /** > > * > > */ > > private static final long serialVersionUID = 1L; > > > public void addAppointment(String subject, Date appointStartDate, > > Date appointEndDate, String startTime, String endTime, String empID, > > List<Visitor> visitors) throws NotLoggedInException { > > PersistenceManager pm = getPersistenceManager(); > > //get employee > > Employee emp = pm.getObjectById(Employee.class, empID); > > > Appointment newAppoint = new Appointment(subject, > > appointStartDate, appointEndDate, startTime, endTime); > > newAppoint.setVisitors(visitors); > > newAppoint.setEmployee(emp); > > emp.getAppointments().add(newAppoint); > > > try { > > pm.makePersistent(emp); > > } finally { > > pm.close(); > > } > > } > > > private PersistenceManager getPersistenceManager() { > > return PMF.get().getPersistenceManager(); > > } > > > } > > > //Employee Bean > > @PersistenceCapable(identityType = IdentityType.APPLICATION, > > detachable = "true") > > public class Employee implements IsSerializable, IValidatable { > > > @PrimaryKey > > @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) > > @Extension(vendorName="datanucleus", key="gae.encoded-pk", > > value="true") > > private String employeeKey; > > > @NotEmpty(message="You must specify First Name") > > @Length(minimum=3) > > @Persistent > > private String firstName; > > > @NotEmpty(message="You must specify Last Name") > > @Length(minimum=3) > > @Persistent > > private String lastName; > > > @Persistent > > private String title; > > > @NotEmpty(message="You must specify Email Address") > > @Length(minimum=3) > > @Persistent > > private String email; > > > @Persistent > > private String department; > > > @Persistent > > private String phone; > > > @Persistent > > private String extension; > > > @Persistent > > private String companyName; > > > @Persistent(mappedBy = "employee") > > @Element(dependent = "true") > > private List<Appointment> appointments; > > > public Employee(String firstName, String lastName, String title, > > String email, > > String phone, String extension, String department, String > > companyName) { > > this(); > > this.firstName = firstName; > > this.lastName = lastName; > > this.title = title; > > this.email = email; > > this.department = department; > > this.phone = phone; > > this.extension = extension; > > this.companyName = companyName; > > } > > > //getters and setters > > > } > > > //Appointment Bean > > @PersistenceCapable(identityType = IdentityType.APPLICATION, > > detachable = "true") > > public class Appointment implements IsSerializable, IValidatable { > > > @PrimaryKey > > @Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY) > > @Extension(vendorName="datanucleus", key="gae.encoded-pk", > > value="true") > > private String appointKey; > > > @Persistent > > private String subject; > > > @NotEmpty(message="You must specify Start Time") > > @Persistent > > private String startTime; > > > @NotEmpty(message="You must specify End Time") > > @Persistent > > private String endTime; > > > @NotEmpty(message="You must specify Start Date") > > @Persistent > > private Date appointmentStartDate; > > > @NotEmpty(message="You must specify End Date") > > @Persistent > > private Date appointmentEndDate; > > > @Persistent > > private Employee employee; > > > @Persistent > > private List<Visitor> visitors = new ArrayList<Visitor>(); > > > public Appointment(String subject, Date appointStartDate, Date > > appointEndDate, String startTime, String endTime, Employee employee, > > List<Visitor> visitors) > > { > > this(); > > this.subject = subject; > > this.startTime = startTime; > > this.endTime = endTime; > > this.appointmentStartDate = appointStartDate; > > this.appointmentEndDate = appointEndDate; > > this.employee = employee; > > this.visitors = visitors; > > } > > > //getters and setters > > > } -- You received this message because you are subscribed to the Google Groups "Google App Engine for Java" group. To post to this group, send email to google-appengine-j...@googlegroups.com. To unsubscribe from this group, send email to google-appengine-java+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/google-appengine-java?hl=en.