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 in saving a child object "Appointment" and the parent object 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.