2011-02-17 73 views
1

我正在写一个使用休眠的gwt应用程序来保存在服务器上。GWT +休眠+节省带宽

我对顾客 - >订单有类似的概念。因此,如果我创建类客户和类别订单,则在数据库中,订单表具有客户表的外键。

说我想从服务器检索订单,我不关心客户。如果我写了一些东西来降低订单,如果我使用EAGER加载,它会自动降低客户的订单。如果我不想这样做,那么我可以将它作为延迟加载并获取订单,并假定myOrder.getCustomer()== null。

现在,如果我想在客户端上创建订单,是否有办法在订单上设置customerid,然后将其传递给保存,而无需使用它传递客户对象。即

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

或者是唯一的选择我有

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

感谢,

纳丁

回答

0

一个选项是链接到订单的客户使用瞬态场:

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

下面是如何值将在客户端上使用:

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

下面是如何值将在服务器上被用于:

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

该逻辑允许客户端创建顺序之间的链路和客户,而不需要自定义对象本身。另一方面,服务器代码的任务是查找客户实例并将其添加到实际订单中。

这种方法的问题是它向Order对象添加了属性和方法,这些属性和方法并不总是用于目的,并且使代码难以遵循。

另一种方法是更改​​rpcSave操作以接受Order和customerId。服务器将根据id查找客户并自行创建关联。从而节省数据传输的开销,同时保持您的订单对象简单:

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

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

希望这会有所帮助。