gwt hibernate выборка данных один ко многим - PullRequest
1 голос
/ 18 ноября 2011

Я понимаю, что используя GWT и Hibernate, я должен использовать объекты DTO (Data Transfer Objects), которые почти идентичны классам Hibernate (допустим, я не использую Gilead, Dozer или какую-то другую библиотеку).

Так что, если у меня, например, есть следующие объекты:

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 в качестве суффикса для своих имен.

Короткий вопрос: Каков наилучший способ получения объектов DTO из объектов Hibernate?

Объяснение: Как видите, каждый банк содержит несколько банковских счетов, и каждый банковский счет имеет ссылку на банк, которому он принадлежит.

Так что я не могу создавать фиктивные конструкторы печатных копий, потому что это потребовало бы много ручной и сложной работы (возможно, не для этого простого примера, но проблема усложняется, когда участвуют новые сущности).

Если я хочу получить все компании, я бы сделал что-то вроде:

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

Теперь у меня есть только компании в спящих объектах, но мне также нужны их уважаемые города, банковские счета и банки, к которым принадлежат их счета. Также я должен скопировать все это в объект DTO, но я хочу избежать дубликатов.

Как мне это сделать?

Как вернуть несколько наборов банков, счетов, городов, компаний в нескольких классах, которые содержат ссылки на объекты, которые не дублируются в этих классах, в качестве объектов DTO?

Я не могу создавать конструкторы копирования в объектах DTO, потому что я могу создать бесконечную рекурсию, и если я каким-то образом избегаю этого, я не знаю, как бы мне не создавать дубликаты.

Надеюсь, я был понятен и не создавал дубликат сам (есть несколько вопросов, но я не видел некоторые с объектами GWT (DTO)).

1 Ответ

1 голос
/ 19 ноября 2011

Вы можете использовать RequestFactory вместо GWT-RPC, поэтому вам не нужно вручную копировать ваши сущности в объекты DTO. RequestFactory использует простые интерфейсы (прокси именованных сущностей) на клиенте для выполнения роли объектов DTO. Из документов:

RequestFactory автоматически распространяет свойства стиля бина между сущности на сервере и соответствующий EntityProxy на клиент. Кроме того, интерфейс EntityProxy включает RequestFactory вычислять и отправлять только изменения («дельты») на сервер.

...