Получить структуру графа в Hibernate - PullRequest
5 голосов
/ 27 января 2011

Структура объекта выглядит следующим образом:

  • Счет
    • Клиент
    • Дата
    • Число
    • имеет много строк продукта (продукт, Количество, Цена)
    • имеет много ServiceLines (Сервис, Количество, Цена)
    • имеет много PaymentOptions (PaymentType (Чек, Квитанция и т. Д.), Дата, Сумма)

Если мне нужно получить список счетов за заданный период с помощью Hibernate, то это очень легко сделать с отложенной загрузкой без написания кода, просто вызовите get ... НО есть и недостатокмного вызовов БД, поэтому в многопользовательской среде это решение не подходит.

С простым JDBC я решил это, используя 3 запроса: 3 соединения между Invoice и ProductLines, Invoice и ServiceLines и Invoice и Payment Options.После этого я построил объект в памяти.

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

Ответы [ 2 ]

4 голосов
/ 27 января 2011

Вы можете использовать запросы с выборкой объединений, чтобы получить весь объектный граф в память:

Query query = entityManager.createQuery("select distinct invoice from Invoice as invoice " 
            + "left join fetch invoice.productLines "                
            + "left join fetch invoice.serviceLines "
            + "left join fetch invoice.paymentOptions");
for (Object object : query.getResultList()) {
    // Code here
}
4 голосов
/ 27 января 2011

Вы можете рассмотреть возможность пакетной выборки для строк счета-фактуры и активную выборку для многих в одну ассоциацию, такую ​​как Клиент.

Это не приведет вас к одному вызову БД, но если вы настроите размеры своих партий так, чтобы они слегка превышали среднее число строк каждого типа в счете, то вы можете получить по одной на каждый тип линии.

Вы также можете запросить, используя JPQL / HQL, и явно извлекать-соединять строки (, как Расс описывает ), но вы получаете больший набор результатов, чем при использовании подхода пакетной выборки:

Query query = entityManager.createQuery("select distinct invoice from Invoice as invoice " 
            + "left join fetch invoice.productLines "                
            + "left join fetch invoice.serviceLines "
            + "left join fetch invoice.paymentOptions");
for (Object object : query.getResultList()) {
    // Code here
}

Если размер переданных необработанных данных оказывается слишком большим, вы можете явно отключить выборку, удалив «fetch» ​​из запроса в соответствующих местах.

Обратите внимание, что существует проблема с использованием JPQL, поскольку компилятор не может проверить все имена свойств для вас, а если выборка отключена для всех ассоциаций, тогда запрос является чистой стоимостью. Вы можете начать с пакетной выборки, если производительность не является непосредственной проблемой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...