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, которая до сих пор не исправлена.

https://code.google.com/p/google-web-toolkit/issues/detail?id=6354&q=set&colspec=ID%20Type%20Status%20Owner%20Milestone%20Summary%20Stars

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

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