3

我对 RequestFactory 有一点关于 Set 形状的子集合的持久性的问题。我在后端使用带有和 Hibernate4/Spring3 的 2.5 。我正在使用 Spring 的过滤器,以便可以在我的 DAO 的 save 方法中的 findByID 之后保留集合。我的问题是,当子集合基于 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);
//....
}

问题是每个请求仅向集合服务器端添加 1 个子实体。例如,indicationTemplate 有 2 个proposalTemplate,我又添加了 4 个,然后在服务器端 saveIndicationTemplate 实体只包含 3 个而不是 6 个。如果发生,无论我之前有多少实体,我添加了多少,我只会得到 1在服务器上比以前更多。我确实在触发 requestContext 方法之前检查了代理对象,并且它已完全加载,以及它的所有子对象。最后最奇怪的是,如果我替换 Set per List (以及所有后续更改),一切都很顺利!

使用Sets而不是Lists时RF无法将所有更改传输到服务器可能有什么问题吗?顺便说一句,在这种情况下,我确实更喜欢 Sets,所以这就是我要问的原因。

任何人?

感谢您的帮助!

4

1 回答 1

4

我假设你遇到了这个错误。这是一个尚未修复的已知 gwt 错误。

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

尝试使用 list 而不是 set 应该没问题。

于 2013-05-27T15:34:21.803 回答