gwt hibernate一对多数据获取

时间:2011-11-18 17:52:02

标签: hibernate gwt mapping one-to-many

我意识到使用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)对象)。

1 个答案:

答案 0 :(得分:1)

您可以使用RequestFactory代替GWT-RPC,因此您无需手动将实体复制到DTO对象。 RequestFactory在客户端上使用简单接口(命名实体代理)来填充DTO对象的角色。来自文档:

  

RequestFactory自动传播bean风格的属性   服务器上的实体和相应的EntityProxy   客户。此外,EntityProxy接口启用RequestFactory   计算并仅向服务器发送更改(“增量”)。