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()
методы?