В этой статье суммируются четыре способа решения проблемы ленивой загрузки Hibernate в процессе обучения Hibernate.
Так называемая ленивая нагрузка задерживается нагрузка, отсроченная нагрузка.
Когда использовать ленивую нагрузку? Я могу ответить только на то, что когда вы хотите использовать ленивую нагрузку, используйте ленивую нагрузку.
Что касается того, почему нам нужно использовать ленивую нагрузку, очевидно, что, когда объем данных, к которым мы хотим получить доступ, слишком велик, он, очевидно, не подходит для использования кэша, поскольку емкость памяти ограничена. Чтобы уменьшить количество параллелистики и уменьшить потребление системных ресурсов, мы позволяем загружать данные при необходимости, а затем используем ленивую нагрузку.
Например, есть объект, который является сотрудником и другой объект, который является отделом. Очевидно, что для сотрудников это отношения между ними по сравнению с департаментом, и для департамента это отношения один ко многим по сравнению с сотрудниками. Когда мы запросим объект сотрудника, если мы хотим запросить соответствующий отдел через отдел имущества объекта сотрудника, будет брошено исключение. Это из -за существования ленивой загрузки. После закрытия сеанса Hibernate выдает другой запрос в базу данных, и исключение брошено.
Ниже приведены четыре способа решить эту проблему:
1. Явная инициализация (внутри метода запроса)
Когда спрашивает, к какому департаменту принадлежит сотрудник, вам необходимо предварительно запрашивать департамент
Используйте оператор
Hibernate.initialize (deviret.class);
2. Изменить файл отношений объекта и переписать ленивый ленивый = false, то есть закрыть ленивую загрузку
Два выше, два метода могут решить проблему, но недостаток заключается в том, что независимо от того, используется ли объект позже, Hibernate выпустит операторы SQL в базу данных для запроса данных, вызывая ненужные отходы производительности.
3. Используйте фильтры (веб -проект)
① Способ получить сеанс должен использовать GetCurrentSessionSession
② Специальный метод закрытия сеанса
public void dofilter (запрос ServletRequest, ответ servletresponse, FilterChain arg2) бросает ioException, ServletException {// TODO Auto Generated Method Session Session = null; Транзакция tx = null; try {session = hibernateutil.getcurrentsession (); tx = session.beginTransaction (); arg2.dofilter (запрос, ответ); // запросы постоянно идут в TX.commit (); } catch (Exception e) {// todo: обрабатывать исключение if (tx! = null) {tx.rollback (); }} наконец {// Специальный метод закрытия hibernateutil.closecurrentsession (); }}4. В платформе SSH используйте OpenSessionView, предоставленную весной
Принцип аналогичен использованию фильтра в третьем методе, за исключением того, что этот фильтр предоставляется пружиной. При его использовании вам нужно только настроить его в файле web.xml следующим образом:
<!-- Use spring to solve lazy loading problems --> <filter> <filter-name>OpenSessionInViewFilter</filter-name> <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class> </filter> <filter-mapping> <filter-name>OpenSessionInViewFilter</filter-name> <Url-pattern>/*</url-pattern> </filter-mapping>
Методы в 3 и 4 также могут решить проблему ленивой нагрузки, а четвертый метод также используется чаще в настоящее время. Однако эти два метода также имеют недостатки. Недостатком является то, что они продлевают время, когда сеанс закрыт, и жизненный цикл сеанса становится длиннее. Перед использованием этого метода сеанс был закрыт после запроса данных; Теперь сеанс закрыт в конце веб -запроса.
Суммировать
Вышеуказанное все о четырех способах решения проблемы ленивой загрузки Hibernate. Я надеюсь, что это будет полезно для всех. Заинтересованные друзья могут продолжать ссылаться на другие связанные темы на этом сайте. Если есть какие -либо недостатки, пожалуйста, оставьте сообщение, чтобы указать это. Спасибо, друзья, за вашу поддержку на этом сайте!