2015-11-27 3 views
1

Один из нашей модели объекта в нашем приложении есть много полеев, настроенных быть охотно принесли как так:Hibernate: Force ленивого-loadding на нетерпеливого поля

@ManyToOne(fetch = FetchType.EAGER) 
@JoinColumn(name = "field") 
public Field getField() { 
    return this.field; 
} 

Однако я когда-то не нужны эти данные, которые замедляют мои запросы ни за что. Я не могу изменить поведение и использовать FetchType.LAZY, так как я не знаю, какое влияние окажут на все приложение (наследие ...). Есть ли способ просто сообщить hibernate, чтобы ничего не получать, кроме, если он указан в запросе?

+0

вы используете HQL или критериев? – Marius

+0

HQL в основном (именованный запрос), но при необходимости я могу переключиться на критерии. – Flanfl

ответ

0

Последний раз я проверил там не было надлежащего решение, предоставляемое спящий режим, так что я закончил с этим решением:

  • Настроенные проблемные ссылки в LAZY.
  • Все затрагиваемые методы обслуживания (которые использовали эти модели) получили перегруженную версию с boolean forceEager
  • по умолчанию все существующие функции были реорганизованным, чтобы вызвать новые с forceEager=true
  • и здесь приходит трюк: как средство " заставляя жадную выборку «я не нашел ничего лучше, чем фактически получить доступ к проксированным (ленивым) объектам. В случае, если, например, список с ленивой ссылкой, сделанный list.size(), заставит Hibernate загрузить полный список, следовательно, служба вернется с полностью извлеченным объектом.

Если затронуто более одного слоя в вашей объектной структуре, вам необходимо пройти через всю иерархию и получить доступ к каждому лениво загружаемому объекту сверху вниз.

Это решение, подверженное ошибкам, поэтому вам нужно обращаться с ним с осторожностью.

0

Если его можно переключить Критерии для этого запроса, вы можете использовать FetchMode.SELECT для свойства поля

crit.setFetchMode("field", FetchMode.SELECT); 
+0

Спасибо за ответ. Я попробовал, но ничего не изменилось, у меня все еще есть много запросов SELECT. Я думаю, что мое единственное решение - оставить его или изменить все на LAZY и исправить все сломанные коды ... – Flanfl