2011-02-10 3 views
6

Existe-t-il un moyen d'utiliser RequestFactory pour créer deux entités dans une même requête? J'ai essayé:GWT RequestFactory et plusieurs demandes

EmployeeRequest request = requestFactory.employeeRequest(); 
    EmployeeProxy newEmployee = request.create(EmployeeProxy.class); 
    newEmployee.setName("Joe!"); 

    Request<Void> createReq = request.persist().using(newEmployee); 
    createReq.fire(); 

    EmployeeProxy newEmployee2 = request.create(EmployeeProxy.class); 
    newEmployee2.setName("Sam!"); 

    Request<Void> createReq2 = request.persist().using(newEmployee2); 
    createReq2.fire(); 

Mais je reçois une erreur qu'une demande est déjà en cours. Quand je fis deux EmployeeRequests séparés:

EmployeeRequest request = requestFactory.employeeRequest(); 
    EmployeeProxy newEmployee = request.create(EmployeeProxy.class); 
    newEmployee.setName("Joe!"); 

    Request<Void> createReq = request.persist().using(newEmployee); 
    createReq.fire(); 

    EmployeeRequest request2 = requestFactory.employeeRequest(); 
    EmployeeProxy newEmployee2 = request2.create(EmployeeProxy.class); 
    newEmployee2.setName("Sam!"); 

    Request<Void> createReq2 = request2.persist().using(newEmployee2); 
    createReq2.fire(); 

Ensuite, deux demandes distinctes sont faites à partir du navigateur. J'espère que quelque chose dans le RequestFactory peut fusionner plusieurs demandes - je dois créer des centaines d'entités à la fois, et je ne veux pas faire des centaines de demandes!

Répondre

9

Oui, c'est possible. Dans votre premier exemple, il suffit de retirer la ligne

createReq.fire(); 

Lorsque vous appelez createReq2.fire() à la fin, puis GWT envoie à la fois newEmployee et newEmployee2 dans une seule demande (parce qu'ils étaient tous les deux persistaient dans le contexte de votre EmployeeRequest « request »). Personnellement, je trouve la sémantique un peu étrange, mais c'est juste mon opinion.

Additif Riley: La syntaxe suivante est équivalente et est beaucoup plus intuitive:

EmployeeRequest request = requestFactory.employeeRequest(); 
    EmployeeProxy newEmployee = request.create(EmployeeProxy.class); 
    newEmployee.setName("Joe!"); 

    request.persist().using(newEmployee); 

    EmployeeProxy newEmployee2 = request.create(EmployeeProxy.class); 
    newEmployee2.setName("Sam!"); 

    request.persist().using(newEmployee2); 
    request.fire(); 
+0

Oh, comment bizarre. Vraiment étrange. Cela signifie-t-il que je dois créer un mécanisme pour planifier un appel fire() après avoir fait tous les appels persist() que je veux faire? Je suppose que ce serait assez simple à faire avec une commande différée, mais ... plutôt maladroite! –

+0

@Riley: J'envelopperais tout le code qui construit la requête dans une méthode ou dans son propre objet. J'utiliserais une variable (ou un champ) pour me souvenir de la dernière requête. Ensuite, après l'exécution de cette partie du code, j'appelle fire sur la dernière requête. (Je n'utiliserais pas une commande différée - c'est trop fragile, car ce n'est pas facile à vérifier, quand exactement ça va s'exécuter.) –

+0

Mise à jour: Je faisais une bêtise et maintenant votre code fonctionne très bien. Je vais réfléchir à des façons d'agréger les demandes. Merci Chris! –

Questions connexes