2011-11-18 79 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'被设计用于任何持久性框架。 –