GWT RequestFactory с Set sub-collection
У меня есть небольшая проблема с RequestFactory относительно сохранения дочерних коллекций в форме Set . Я использую gwt 2.5 с /questions/tagged/requestfactory и Hibernate4/Spring3 на серверной части. Я использую фильтр /questions/tagged/open-session-in-view от Spring, чтобы коллекции могли сохраняться после findByID в методе сохранения моего DAO. Моя проблема в том, что все работает нормально, когда дочерние коллекции основаны на List, но когда они основаны на Set, не все элементы клиента достигают сервера.
Мой код выглядит так:
Корневая сущность IndicationTemplate:
@Entity
@Table (name = "vdasIndicationTemplate")
@org.hibernate.annotations.Table ( appliesTo = "vdasIndicationTemplate", indexes =
{@Index (name = "xieIndicationTemplateCreateUser", columnNames= {"createUserID"}),
@Index (name = "xieIndicationTemplateModifyUser", columnNames= {"modifyUserID"})})
public class IndicationTemplate extends AbstractEditable <Integer> implements IEntity <Integer>, IDateable, IDescriptable {
//...
private Set <ProposalTemplate> proposalTemplates = null;
//...
@OneToMany (fetch = FetchType.LAZY, mappedBy = "indicationTemplate"
, cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH, CascadeType.DETACH})
public Set <ProposalTemplate> getProposalTemplates () {
return proposalTemplates;
}
public void setProposalTemplates (Set <ProposalTemplate> proposalTemplates) {
this.proposalTemplates = proposalTemplates;
}
//...
}
-Детский объект ProposalTemplate, конечно, имеет противоположное отображение ManyToOne и имеет 3 подгруппы одного и того же вида с 3 различными объектами.
-Клиент-прокси для корневого объекта:
@ProxyFor (value = IndicationTemplate.class, locator = PersistenceEntityLocator.class)
public interface IIndicationTemplateProxy extends IEntityProxy, IDeletableProxy, IDescriptableProxy {
//....
Set <IProposalTemplateProxy> getProposalTemplates ();
void setProposalTemplates (Set <IProposalTemplateProxy> proposalTemplateProxy);
}
На клиенте я отображаю атрибуты корневого объекта, а также список дочерних объектов. Затем пользователь может обновить их, и изменения будут сохранены обратно в коллекцию следующим образом:
Set <IProposalTemplateProxy> newList = getElementsFromUiSomehow (); //these elements can be new or just the old ones with some changes
indicationTemplate.getProposalTemplates ().clear ();
indicationTemplate.getProposalTemplates ().addAll (newList);
-А потом в какой-то момент:
requestContext.saveIndicationTemplate ((IIndicationTemplateProxy) entityProxy)
.fire (new Receiver <IIndicationTemplateProxy> ()
- RequestContext выглядит примерно так:
@Service (value = TemplateService.class, locator = SpringServiceLocator.class)
public interface ITemplateRequestContext extends RequestContext {
/** saves (creates or updates) one given indication template */
Request <IIndicationTemplateProxy> saveIndicationTemplate (IIndicationTemplateProxy indicationTemplate);
//....
}
Проблема состоит в том, что только один дочерний объект добавляется к запросу на стороне сервера сбора. Например, в индикации-шаблоне есть 2 предложения-шаблона, и я добавляю еще 4, а затем на стороне сервера saveIndicationTemplate сущность содержит только 3 вместо 6. Если это происходит независимо от того, сколько у меня ранее сущностей и сколько я добавляю, я получаю только 1 больше, чем раньше на сервере. Я проверял прокси-объект прямо перед запуском метода requestContext, и он полностью загружен со всеми его дочерними элементами. И, наконец, самое странное, что если я заменю Set per List (и все последующие изменения), все будет хорошо!
Может ли возникнуть какая-либо проблема, почему RF не передает все изменения на сервер при использовании наборов вместо списков? Кстати, я предпочитаю Сеты в этом случае, поэтому я и спрашиваю.
Кто-нибудь?
Спасибо за помощь!
1 ответ
Я полагаю, вы попали в эту ошибку. Это известная ошибка gwt, которая до сих пор не исправлена.
попробуйте использовать список вместо набора, и это должно быть хорошо.