Собеседование по Java EE — Hibernate Framework (вопросы и ответы). Часть 2

Вопросы и ответы на собеседование по теме Hibernate Framework. Часть 2.

к списку вопросов раздела JEE

Собеседование по Java EE — Hibernate Framework (вопросы и ответы). Часть 1.

Вопросы

31. Как логировать созданные Hibernate SQL запросы в лог-файлы?
32. Что вы знаете о Hibernate прокси и как это помогает в ленивой загрузке (lazy load)?
33. Как реализованы отношения в Hibernate?
34. Как управлять транзакциями с помощью Hibernate?
35. Что такое каскадные связи (обновления) и какие каскадные типы есть в Hibernate?
36. Как добавить логирование log4j в Hibernate приложение?
37. Как использовать JNDI DataSource сервера приложений с Hibernate Framework?
38. Как интегрировать Hibernate и Spring?
39. Что вы знаете о классе HibernateTemplate?
40. Как интегрировать Hibernate с Servlet или Struts2 веб приложением?
41. Какие паттерны применяются в Hibernate?
42. Расскажите о Hibernate Validator Framework.
43. Какие преимущества дает использование плагина Hibernate Tools Eclipse?
44. Best Practices в Hibernate.

Ответы

31. Как логировать созданные Hibernate SQL запросы в лог-файлы?

Для логирования запросов SQL добавьте в файл конфигурации Hibernate строчку:

Отметьте, что это необходимо использовать на уровне Development или Testing и должно быть отключено в продакшн.

32. Что вы знаете о Hibernate прокси и как это помогает в ленивой загрузке (lazy load)?

Hibernate использует прокси объект для поддержки отложенной загрузки. Обычно при загрузке данных из таблицы Hibernate не загружает все отображенные (замаппинные) объекты. Как только вы ссылаетесь на дочерний объект или ищите объект с помощью геттера, если связанная сущность не находиться в кэше сессии, то прокси код перейдет к базе данных для загрузки связанной сущности. Для этого используется javassist, чтобы эффективно и динамически создавать реализации подклассов ваших entity объектов.

33. Как реализованы отношения в Hibernate?

Реализовать отношение one-to-one, one-to-many, many-to-many можно с помощью JPA аннотаций или конфигурирования xml файла. За примерами посетите раздел Hibernate.

34. Как управлять транзакциями с помощью Hibernate?

Hibernate вообще не допускает большинство операций без использования транзакций. Поэтому после получения экземпляра session от SessionFactory необходимо выполнить beginTransaction() для начала транзакции. Метод вернет ссылку, которую мы можем использовать для подтверждения или отката транзакции.

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

35. Что такое каскадные связи (обновления) и какие каскадные типы есть в Hibernate?

Если у нас имеются зависимости между сущностями (entities), то нам необходимо определить как различные операции будут влиять на другую сущность. Это реализуется с помощью каскадных связей (или обновлений). Вот пример кода с использованием аннотации @Cascade:

Обратите внимание, что есть некоторые различия между enum CascadeType в Hibernate и в JPA. Поэтому обращайте внимание какой пакет вы импортируете при использовании аннотации и константы типа. Наиболее часто используемые CascadeType перечисления описаны ниже.

  1. None: без Cascading. Формально это не тип, но если мы не указали каскадной связи, то никакая операция для родителя не будет иметь эффекта для ребенка.
  2. ALL: Cascades save, delete, update, evict, lock, replicate, merge, persist. В общем — всё.
  3. SAVE_UPDATE: Cascades save и update. Доступно только для hibernate.
  4. DELETE: передает в Hibernate native DELETE действие. Только для hibernate.
  5. DETATCH, MERGE, PERSIST, REFRESH и REMOVE – для простых операций.
  6. LOCK: передает в Hibernate native LOCK действие.
  7. REPLICATE: передает в Hibernate native REPLICATE действие.

36. Как добавить логирование log4j в Hibernate приложение?

  • Добавить зависимость log4j в проект.
  • Создать log4j.xml или log4j.properties файл и добавить его в classpath.
  • Для веб приложений используйте ServletContextListener, а для автономных приложений DOMConfigurator или PropertyConfigurator для настройки логирования.
  • Создайте экземпляр org.apache.log4j.Logger и используйте его согласно задачи.

Может быть полезно посетить раздел Log4j2.

37. Как использовать JNDI DataSource сервера приложений с Hibernate Framework?

В веб приложении лучше всего использовать контейнер сервлетов для управления пулом соединений. Поэтому лучше определить JNDI ресурс для DataSource и использовать его в веб приложении. Для этого в Hibernate нужно удалить все специфичные для базы данных свойства и использовать указания свойства JNDI DataSource:

38. Как интегрировать Hibernate и Spring?

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

  • Добавить зависимости для hibernate-entitymanager, hibernate-core и spring-orm.
  • Создать классы модели и передать реализации DAO операции над базой данных. Важно, что DAO классы используют SessionFactory, который внедряется в конфигурации бинов Spring.
  • Настроить конфигурационный файл Spring (смотрите в офф. документации или из примера на этом сайте).
  • Дополнительно появляется возможность использовать аннотацию @Transactional и перестать беспокоиться об управлении транзакцией Hibernate.

Пример использования Spring Data JPA — пример приложения Hello World. Настройки Spring Data + JPA + Hibernate + MySQL.

39. Что вы знаете о классе HibernateTemplate?

Spring Framework предоставляет различные подходы для интеграции с Hibernate. Тем не менее, мы наиболее часто будем использовать подход, использующий HibernateTemplate. Есть две основные причины:

  • Класс скрывает детали управления сессиями и транзакциями.
  • Предоставляет подход основанный на шаблонах

HibernateTemplate класс скрывает трудности управления сессиями и транзакциями при использовании Hibernate для доступа к данным. Нужно только инициализировать HibernateTemplate путем передачи экземпляра SessionFactory. Spring Framework берет на себя беспокойство за детали связанные с сессиями и транзакциями. Это помогает устранить инфраструктурный код, который может вносить суматоху при увеличении сложности.
HibernateTemplate, так же как и JdbcTemplate, предоставляет шаблонный подход для доступа к данным. Когда вы используете HibernateTemplate, вы будете работать с callbacks. Обратные вызовы — это единственный механизм в шаблонном подходе, который уведомляет шаблон запускать нужную задачу. Преимущество наличия обратного вызова в том, что там только одна точка входа в слой доступа к данным. И эта точка входа определяется шаблоном, в этом случае HibernateTemplate.

В комментариях дополнили, что использование HibernateTemplate не явлется рекомендуемым. Вместо использования HibernateTemplate из пакета org.springframework.orm рекомендуется использовать декларативный подход (@Transactional). Таким образом фреймворк сам позаботится об операциях open, commit, close, flush.

Доступ к данным используя Spring Framework: Hibernate template: http://www.spring-source.ru/articles.php?type=manual&theme=articles&docs=article_08

Stackoverflow: http://stackoverflow.com/questions/18002768/why-hibernatetemplate-isnt-recommended

40. Как интегрировать Hibernate с Servlet или Struts2 веб приложением?

Для интеграции необходимо использовать ServletContextListener. Более подробный пример смотрите по ссылке

http://www.journaldev.com/3557/struts2-hibernate-integration-example-tutorial

41. Какие паттерны применяются в Hibernate?

  • Domain Model Pattern – объектная модель предметной области, включающая в себя как поведение так и данные.
  • Data Mapper – слой мапперов (Mappers), который передает данные между объектами и базой данных, сохраняя их независимыми друг от друга и себя.
  • Proxy Pattern — применяется для ленивой загрузки.
  • Factory pattern — используется в SessionFactory

42. Расскажите о Hibernate Validator Framework.

Проверка данных является неотъемлемой частью любого приложения. Hibernate Validator обеспечивает эталонную реализацию двух спецификаций JSR-303 и JSR-349 применяемых в Java. Для настройки валидации в Hibernate необходимо сделать следующие шаги.

  • Добавить hibernate validation зависимости в проект.

  • Так же требуются зависимости из JSR 341, реализующие Unified Expression Language для обработки динамических выражений и сообщений о нарушении ограничений.

  • Использовать необходимые аннотации в бинах.

43. Какие преимущества дает использование плагина Hibernate Tools Eclipse?

Плагин Hibernate Tools упрощает настройку маппинга, конфигурационного файла. Упрощает работы с файлами свойств или xml тегами. Помогает минимизировать ошибки написания кода.

44. Best Practices в Hibernate.

При использовании фреймворка Hibernate рекомендуется придерживаться некоторых правил.

  • Всегда проверяйте доступ к primary key. Если он создается базой данных, то вы не должны иметь сеттера.
  • По умолчанию hibernate устанавливает значения в поля напрямую без использования сеттеров. Если необходимо заставить хибернейт их применять, то проверьте использование аннотации @Access(value=AccessType.PROPERTY) над свойством.
  • Если тип доступа — property, то удостоверьтесь, что аннотация используется с геттером. Избегайте смешивания использования аннотации над обоими полями и геттером.
  • Используйте нативный sql запрос только там, где нельзя использовать HQL.
  • Используйте ordered list вместо сортированного списка из Collection API, если вам необходимо получить отсортированные данные.
  • Применяйте именованные запросы разумно — держите их в одном месте и используйте только для часто применяющихся запросов. Для специфичных запросов пишите их внутри конкретного бина.
  • В веб приложениях используйте JNDI DataSource вместо файла конфигурации для соединения с БД.
  • Избегайте отношений многие-ко-многим, т.к. это можно заменить двунаправленной One-to-Many и Many-to-One связью.
  • Для collections попробуйте использовать Lists, maps и sets. Избегайте массивов (array), т.к. они не дают преимуществ ленивой загрузки.
  • Не обрабатывайте исключения, которые могут откатить транзакцию и закрыть сессию. Если это проигнорировать, то Hibernate не сможет гарантировать, что состояние в памяти соответствует состоянию персистентности (могут быть коллизии данных).
  • Применяйте шаблон DAO для методов, которые могут использоваться в entity бинах.
  • Предпочитайте ленивую выборку для ассоциаций.

 

к списку вопросов раздела JEE

Собеседование по Java EE — Hibernate Framework (вопросы и ответы). Часть 1.

Share Button
12
2817 Total Views 1 Views Today
1 комментарий для “Собеседование по Java EE — Hibernate Framework (вопросы и ответы). Часть 2
  1. anonymous grateful reader:

    35. DETATCH -> DETACH

    39. HibernateTemplate isn’t recommended anymore

    http://stackoverflow.com/questions/18002768/why-hibernatetemplate-isnt-recommended

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*