我意识到使用GWT和Hibernate我必须使用与Hibernate类几乎相同的DTO(数据传输对象)对象(假设我没有使用Gilead或Dozer或其他lib)。
例如,如果我有以下实体:
Company (id, name, city_id),
Bank (id, name),
BankAccount(id, account, bank_id, company_id),
City(id, name)
所以城市可以有多家公司,银行(需要)和公司(可以)都包含多个银行账户。 类似的东西:
Bank -< BankAccount >- Company >- City
这些是我的hibernate和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对象的最佳方法是什么?
说明: 如您所见,每个Bank包含多个BankAccounts,每个BankAccount都引用它所属的Bank。
所以我不能制作虚拟硬拷贝构造函数,因为它意味着许多手工和复杂的工作(可能不是这个简单的例子,但是当涉及新实体时问题变得复杂)。
如果我想要所有公司,我会做类似的事情:
//necessary Hibernate Stuff
List<Company> companies = new ArrayList<Company>(s.createQuery("from Company").list());
现在我只有hibernate对象中的公司,但我还需要他们尊重的城市,银行账户和他们账户所属的银行。此外,我必须将所有这些复制到DTO对象,但我想避免重复。
我该怎么做?
如何在多个类中返回多组银行,帐户,城市,公司,这些类包含对这些类中没有重复的对象的引用,作为DTO对象?
我无法在DTO对象中创建复制构造函数,因为我可以创建无限递归,如果我以某种方式避免这种情况,我不知道如何创建重复项。
我希望我很清楚并且没有自己创建副本(很少有问题,但没有看到一些与GWT(DTO)对象)。
答案 0 :(得分:1)
您可以使用RequestFactory代替GWT-RPC
,因此您无需手动将实体复制到DTO对象。 RequestFactory
在客户端上使用简单接口(命名实体代理)来填充DTO对象的角色。来自文档:
RequestFactory自动传播bean风格的属性 服务器上的实体和相应的EntityProxy 客户。此外,EntityProxy接口启用RequestFactory 计算并仅向服务器发送更改(“增量”)。