Лучший способ переопределить ленивую загрузку Hibernate в этом случае - PullRequest
1 голос
/ 14 февраля 2010

Предположим, у вас есть класс B с лениво загруженным свойством c. И что это хорошо везде в системе, кроме следующего:

У вас есть класс A со свойством b класса B. Всякий раз, когда вы загружаете сущность типа A, вы хотите загружать полную цепочку a.b.c без ленивости.

Есть ли способ настроить этот тип логики в Hibernate?

Edit:
Свойство также может быть определено с помощью formula, который является выражением SQL. В документации сказано:

Получена мощная функция свойства. Эти свойства по определение только для чтения. Недвижимость значение вычисляется во время загрузки. Вы объявить вычисление как SQL выражение. Это затем переводит в Подзапрос предложения SELECT в SQL запрос, который загружает экземпляр:

<property name="totalPrice"
    formula="( SELECT SUM (li.quantity*p.price) FROM [...] )"/>

Это сработало бы, если бы это был запрос Hibernate, который возвратил объект Hibernate.

Редактировать 2:
Другие мысли включают объявление класса B2, который точно такой же, как B, за исключением того, что свойство C не загружается с отложенным доступом.

Пока варианты :

  1. Каждый раз полагаться на запрос, как предлагает skaffman.
  2. Используйте формулу в свойстве, чтобы получить поля, которые я хочу, но без объекта.
  3. Создайте B2 класс с не ленивым b.c. (некрасиво).

Ответы [ 2 ]

2 голосов
/ 15 февраля 2010

Если это не распространенный случай в вашем приложении (и не должен), вы можете вручную инициализировать зависимые объекты после извлечения объекта A, используя Hibernate.initialize(..)

1 голос
/ 14 февраля 2010

Используя HQL, что-то вроде этого:

from A as a
    inner join fetch a.b
    inner join fetch b.c
...