2011-11-18 106 views
1

我意識到使用GWT和Hibernate我必須使用與Hibernate類幾乎相同的DTO(數據傳輸對象)對象(假設我沒有使用Gilead或Dozer或一些其他的lib)。gwt休眠一對多數據提取

所以,如果我舉個例子,有以下實體:

Company (id, name, city_id), 
Bank (id, name), 
BankAccount(id, account, bank_id, company_id), 
City(id, name) 

這樣的城市可以有多個公司和銀行都(需要)和公司(罐)包含多個銀行賬戶。 喜歡的東西:

Bank -<BankAccount>- Company >- City 

這些屬性我休眠和DTO類有

class Company{ 
    int id; 
    String name; 
    City city; 
    Set<BankAccount> accounts; 
    //with appropriate getters and setters 
} 
class Bank{ 
    int id; 
    String name; 
    Set<BankAccount> accounts; 
    //with appropriate getters and setters 
} 
class BankAccount{ 
    int id; 
    String account; 
    Bank bank; 
    Company company; 
    //and all get set 
} 
class City{ 
    int id; 
    String name; 
    //all get set 
} 

DTO類是相同的,只有DTO作爲後綴他們的名字。

簡短的問題是: 從Hibernate對象中獲取DTO對象的最佳方式是什麼?

說明: 如您所見,每個銀行都包含多個BankAccounts,並且每個BankAccount都引用它所屬的銀行。

所以我不能製作虛擬硬拷貝構造函數,因爲它意味着大量的手動和複雜的工作(可能不是這個簡單的例子,但問題變得複雜,因爲涉及新的實體)。

如果我想所有的公司,我會做這樣的事情:

//necessary Hibernate Stuff 
List<Company> companies = new ArrayList<Company>(s.createQuery("from Company").list()); 

現在我只有公司在休眠的對象,但我也需要他們的尊重城市,銀行賬戶和銀行自己的賬戶屬於。此外,我必須將所有這些複製到DTO對象,但我想避免重複。

我該怎麼做?

如何將多組銀行,帳戶,城市,公司的多個類中包含對象的引用作爲DTO對象返回到整個這些類中?

我不能在DTO對象中創建複製構造函數,因爲我可能會創建無限遞歸,如果我確實避免了這種情況,我不知道如何不創建重複項。

我希望我很清楚,並沒有自己創建重複(有幾個問題,但沒有看到一些與GWT(DTO)對象)。

回答

1

您可以使用RequestFactory而不是GWT-RPC,因此您不必手動將實體複製到DTO對象。 RequestFactory在客戶端使用簡單的接口(命名實體代理)來填充DTO對象的角色。從文檔:

RequestFactory自動傳播該服務器上 實體和 客戶端上的相應EntityProxy之間豆樣式屬性。此外,EntityProxy接口使RequestFactory 能夠計算並僅向服務器發送更改(「deltas」)。

+0

我想在我的項目中使用hibernate。我仍然可以使用hibernate獲取數據庫數據,並使用RequestFactory進行數據傳輸? – nekome

+0

是的,你可以在'Hibernate'中使用'RequestFactory'。事實上'RequestFactory'被設計用於任何持久性框架。 –