3

Set の形をした子コレクションの永続性に関して RequestFactory に少し問題があります。 2.5 を使用し、バックエンドで Hibernate4/Spring3 を使用しています。DAO の save メソッドで findByID の後にコレクションを永続化できるように、Spring によるフィルターを使用しています。私の問題は、子コレクションが 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 つの proposalTemplates があり、さらに 4 つ追加すると、サーバー側の saveIndicationTemplate では、エンティティには 6 ではなく 3 つしか含まれません。サーバー上で以前よりも多く。requestContext メソッドを起動する直前にプロキシ オブジェクトを確認したところ、そのすべての子とともに完全に読み込まれました。最後に、最も奇妙なことは、Set per List (およびその後のすべての変更) を置き換えると、すべてがうまく機能することです!

リストの代わりにセットを使用すると、RF がすべての変更をサーバーに転送できないのはなぜですか?? ところで、私はこの場合セットを好むので、それが私が尋ねている理由です。

誰?

助けてくれてありがとう!

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

セットの代わりにリストを使用してみてください。問題ありません。

于 2013-05-27T15:34:21.803 に答える