GWT RequestFactory не сохраняет присоединенные сущности

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

Мои доменные модели состоят из 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 ответ

Решение

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

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

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

Другие вопросы по тегам