2011-02-17 4 views
1

J'écris une application gwt en utilisant Hibernate pour économiser sur le serveur. J'ai un concept similaire à client -> commandes. Donc, si je crée le client de classe et les ordres de classe, le dans la base de données, la table de commande a une clé étrangère à la table client. Dire que je voulais récupérer les commandes du serveur, et je ne me soucie pas du client. Si j'écris quelque chose pour faire baisser les commandes, cela entraînerait automatiquement la chute du client si j'utilise le chargement EAGER. Si je ne le veux pas, alors je peux le laisser comme chargement paresseux et juste obtenir les commandes, et je suppose que myOrder.getCustomer() == null.GWT + Hibernate + économie de bande passante

Maintenant, si je voulais créer une commande sur le client, existe-t-il un moyen de définir le client sur la commande, puis de le transmettre pour enregistrer sans avoir à passer l'objet client avec lui. à savoir

Order myOrder = new Order(); 
. 
. 
. 
myOrder.setCustomerID("1234"); 
rpcSave(myOrder); 

Ou est la seule option que j'ai

Customer me = new Customer() 
Order myOrder = new Order() 
. 
. 
. 
myOrder.setCustomer(me); 
rpcSave(myOrder); 

Merci,

Nadin

Répondre

0

Une des options est d'utiliser un champ transitoire dans le Client qui est lié à l'Ordre :

public class Order { 
    @Transient 
    private String customerId; 
    ... 
    // setter/getter methods 
} 

Voici comment la valeur sera utilisée sur le client:

Order myOrder = new Order(); 
... 
myOrder.setCustomID("1234"); 
rpcSave(myOrder); 

Voici comment la valeur sera utilisée sur le serveur:

if (order.getCustomerId() != null) { 
    Customer customer = // lookup customer by primary key 
    order.setCustomer(customer); 
} 

Cette logique permet au client de créer le lien entre l'ordre et client sans nécessiter l'objet personnalisé lui-même. D'autre part, le code du serveur serait chargé de rechercher l'instance du client et de l'ajouter à l'ordre réel.

Le problème avec cette approche est qu'elle ajoute des attributs et des méthodes à l'objet Order qui ne servent pas toujours un but et rendent le code plus difficile à suivre.

Une autre approche consisterait à modifier l'opération rpcSave afin de prendre en compte un Order et un customerId. Le serveur recherche le client en fonction de l'identifiant et crée l'association elle-même. économisant ainsi les frais généraux de la transmission de données, tout en gardant votre objet de la commande simple:

// client 
Order myOrder = new Order(); 
... 
rpcSave("1234", myOrder); 

// server 
Customer customer = // find customer by customerID; 
newOrder.setCustomer(customer); 
... 

Hope this helps.