2011-02-17 56 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); 
... 

希望這會有所幫助。