Обновите несколько сущностей через RequestFactory

У меня есть приложения GWT, которые содержат продукты и экспертов, и один продукт может иметь несколько экспертов (отношение OneToMany). У меня возникли проблемы со смешиванием и объединением запросов с использованием двух связанных объектов:

ProductProxy выглядит так:

@ProxyFor(myapplication.server.domain.Product.class)
public interface ProductProxy extends EntityProxy {

    Long getId();

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

    [...]

    EntityProxyId<ProductProxy> stableId();

    Set<ExpertProxy> getExperts();
}

У меня есть диалоговое окно, которое может редактировать продукт, поэтому оно:

ProductProxy selectedProduct; // This comes from a function that delivered all products
productRequest = MyAplication.getRequestFactory().productRequest();
this.product = productRequest.edit(selectedProduct);

При редактировании товара вы также можете добавить к этому товару экспертов:

@ProxyFor(myapplication.server.domain.Expert.class)

public interface ExpertProxy extends EntityProxy {
    public Long getId();
    public void setId(Long id);

    public ProductProxy getProduct();
    public void setProduct(ProductProxy product);
    [...]
}

У меня есть отдельный DialogBox, который появляется для него. В этом диалоговом окне я пытаюсь создать эксперта с продуктом, который редактируется перед передачей в качестве параметра:

expertRequest = MyApplication.getRequestFactory().expertRequest();
ExpertProxy expert = expertRequest.create(ExpertProxy.class);
expert.setProduct(product); // product comes from the productRequest code

Если я попытаюсь это сделать, я получу ошибку при выполнении setProduct, потому что запрос от productRequest смешивается с запросом от expertRequest.

Каков наилучший способ исправить это? Могу ли я добавить эксперта через исходный productRequest? Должен ли я получить идентификатор продукта и использовать его только в своем экспертном запросе? Или я должен добавить определенные функции сервера, чтобы добавить эксперта к продукту? Или есть лучшие варианты?


person Roalt    schedule 17.10.2011    source источник


Ответы (1)


Да, вы должны использовать один и тот же экземпляр RequestContext для всех ваших правок/созданий.

Каждый RequestContext накапливает операции (новые прокси-серверы и сеттеры, вызываемые на прокси-серверах) и вызовы (вызовы сервисных методов) для воспроизведения на сервере. Все это отправляется пакетом, когда вы fire(). Таким образом, ваш ExpoertProxy должен быть создан из того же RequestContext, что и ProductProxy, к которому вы его добавляете.

person Thomas Broyer    schedule 17.10.2011
comment
Итак, должен ли я сохранить результат из MyAplication.getRequestFactory() и сохранить его для создания как productRequest(), так и expertRequest()? - person Roalt; 17.10.2011
comment
О, извините, я не заметил, что у вас два интерфейса RequestContext. В этом случае append() expertRequest() к существующему productRequest() перед create() ExpertProxy. Таким образом вы можете добавить столько экземпляров expoertRequest(), сколько необходимо, поэтому вам не нужно сохранять ссылку на expertRequest(). Кстати, ваш экземпляр RequestFactory, вероятно, должен быть синглтоном. - person Thomas Broyer; 17.10.2011
comment
О, на самом деле нет; вы не вызываете какой-либо сервисный метод на expertRequest(), поэтому он вам не нужен: просто create(ExpertProxy.class) на productRequest() вашего главного экрана. - person Thomas Broyer; 17.10.2011
comment
мерси бокуп! Комментарий об использовании create(ExpertProxy.class) в исходном productRequest() сначала выглядел нелогичным, но это именно то, что мне было нужно. Так что этот комментарий является реальным ответом. - person Roalt; 17.10.2011