GWT RequestFactory не сохраняет присоединенные объекты - PullRequest
3 голосов
/ 11 февраля 2011

Я пытаюсь освоить новый RequestFactory API, и мне действительно тяжело.

Модели моего домена состоят из Staffer, Person и Office. У сотрудника есть Человек и Офис как поля.

Когда я пытаюсь сохранить обновления для экземпляра Staffer в GWT, на серверном вызове persist() я вижу обновления в его примитивных / строковых полях, но не вижу обновлений для прикрепленных Person или Office объектов. Вот как я влияю на правки со стороны GWT:

private void persistStafferDetails()
{
    CRMRequestFactory.StafferRequest stafferRequest = requestFactory.stafferRequest();
    staffer = stafferRequest.edit(staffer);

    PersonProxy person = staffer.getPerson();
    person.setFirstName(firstNameField.getText());
    person.setLastName(lastNameField.getText());

    staffer.setPersonalEmail(personalEmailField.getText());
    staffer.getHomeLocation().setStreetAddress(addressField1.getText());
    staffer.getHomeLocation().setCity(cityField.getText());
    staffer.getHomeLocation().setPostalCode(postalField.getText());
    staffer.getHomeLocation().setProvince(provinceDropDown.getValue(provinceDropDown.getSelectedIndex()));

    stafferRequest.persist().using(staffer).fire();
}

Вот прокси:

@ProxyFor(Staffer.class)
public interface StafferProxy extends EntityProxy
{
    Long getId();

    PersonProxy getPerson();
    void setPerson(PersonProxy person);

    OfficeProxy getOffice();
    void setOffice(OfficeProxy office);

    String getHomePhone();
    void setHomePhone(String homePhone);

    String getCellPhone();
    void setCellPhone(String cellPhone);

    String getPersonalEmail();
    void setPersonalEmail(String personalEmail);

    LocationProxy getHomeLocation();
    void setHomeLocation(LocationProxy homeLocation);
}

@ProxyFor(Person.class)
public interface PersonProxy extends EntityProxy
{
    Long getId();
    void setId(Long id);

    String getFirstName();
    void setFirstName(String firstName);

    String getLastName();
    void setLastName(String lastName);
}


@ProxyFor(Office.class)
public interface OfficeProxy extends EntityProxy
{
    Long getId();

    String getName();
    void setName(String name);
}

А мой CRMRequestFactory выглядит так:

public interface CRMRequestFactory extends RequestFactory
{
  @Service(Staffer.class)
    public interface StafferRequest extends RequestContext
    {
        InstanceRequest<StafferProxy, Void> persist();
        Request<List<StafferProxy>> getAll();
        Request<StafferProxy> findStaffer(Long id);
    }
    public StafferRequest stafferRequest();

    @Service(Person.class)
    public interface PersonRequest extends RequestContext
    {
        InstanceRequest<PersonProxy, Void> persist();
        Request<List<PersonProxy>> getAll();
        Request<PersonProxy> findPerson(Long id);
    }
    public PersonRequest personRequest();

    @Service(Office.class)
    public interface OfficeRequest extends RequestContext
    {
        InstanceRequest<OfficeProxy, Void> persist();
        Request<List<OfficeProxy>> getAll();
        Request<OfficeProxy> findOffice(Long id);
    }
    public OfficeRequest officeRequest();

}

1 Ответ

3 голосов
/ 12 февраля 2011

RequestFactory не рассматривает метод persist() как что-то особенное, поэтому вы должны самостоятельно реализовать цепочечные персистенции или сконфигурировать свою систему ORM для вас. Следует также проверить, что методы findPerson() и findOffice() возвращают один и тот же экземпляр объекта Person или Office, если он вызывается более одного раза. Если вы используете один и тот же EntityManager (или эквивалент вашей системы) в течение всего времени существования входящего HTTP-запроса, это обычно решает проблему «отсутствующих обновлений» с нетривиальными графиками полезной нагрузки.

A сообщение в блоге о цепной персистентности и проблеме ссылка на трекер с кратким обсуждением.

Если это не поможет, не могли бы вы опубликовать пример методов findFoo() и persist() ваших доменных объектов?

...