Приводит ли Hibernate к извлечению нежелательных данных? - PullRequest
2 голосов
/ 25 февраля 2012

Например, давайте скажем, что есть таблица с названием «Класс», и многие «Студенты» принадлежат классу. Если мы хотим получить имя всех студентов с Hibernate, так как мы выбираем объекты Student, фамилия , age и другие данные ( который не загружается ленивым) также будет загружен.

Но с помощью SQL-запроса мы можем получить только имя.

Значит ли это, что использование Hibernate приводит к извлечению нежелательных данных? Если так, разве это не окажет большого влияния на производительность системы?

Ответы [ 2 ]

2 голосов
/ 25 февраля 2012

Если вы хотите получить имя ученика в классе в спящем режиме, вы можете попробовать следующее HQL ,

select s.firstName from Student s where s.divisionId = 4

Это даст вам список имен только студентов. Таким образом, фамилия, возраст и т. д. не будут загружены. Следовательно, для сценария в ваших вопросах вы можете добиться хорошей производительности, используя hibernate.

Теперь, когда вам нужно List<Students> деления 4, используйте следующий запрос:

select s from Student s where s.divisionId = 4

Представьте себе, что вы пишете этот запрос в SQL и конвертируете каждый столбец в соответствующие ему свойства Java и т. Д. Все вышеперечисленные тезисы делают это за вас выше.Таким образом, вы можете настроить гибернацию в соответствии с вашими требованиями.

Когда речь идет о производительности гибернации, она немного медленнее, чем традиционный JDBC, но гораздо удобнее и эффективнее, чем JDBC.В основном, преимущества, которые вы получаете от гибернации, перекрывают меньшие недостатки.

Вы должны узнать о подводных камнях производительности в спящем режиме, таких как Ленивая загрузка , и постараться их избежать.

1 голос
/ 25 февраля 2012

Да, Hibernate выберет все поля, которые не загружены ленивыми.Его влияние на производительность зависит от вариантов использования вашего приложения.Если вам часто требуются частичные (т.е. только один или два столбца) данные из таблицы, которая содержит много столбцов (скажем,> 10), то это определенно увеличит использование памяти, необходимые циклы ЦП и потребление полосы пропускания для передачи данных (если база данныхсервер находится на другой машине, чем сервер приложений).Чтобы преодолеть эту проблему, вы можете использовать NamedQuery .В именованном запросе вы можете просто выбрать нужные столбцы.

...