Spring ORM и Hibernate

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

Подготовка

Нам понадобится пустой maven проект с Spring, Spring ORM, H2, Hibernate и библиотеками тестирования:

Настройка Hibernate

Конфигурация Hibernate традиционно располагается в файле hibernate.cfg.xml В моём примере я использую H2 в качестве базы данных:

Можно использовать любые базы данных и пулы соединений.

Настройка Spring

Для включения поддержки Hibernate в Spring необходимо добавить в контекст особый бин. Можно сделать это программно, а можно с использованием xml конфигурации:

Свойство configLocation указывает на имя и расположение файла конфигурации Hibernate.

Вместо настройки базы в конфигурации hibernate можно использовать Spring для разделения настроек соединения, пула соединений и Hibernate:

В примере выше создаётся пул соединений к базе H2, который передаётся  в конфигурацию Hibernate.

Схема данных

ORM отображает объектную модель данных на реляционную модель данных. Чтобы не загораживать пример, используем как можно более простую модель:

Аннотация  @Entity говорит Hibernate, что это класс сущности, а  @Getter и  @Setter генерируют код для доступа к полям.

Уровень DAO

Хорошим тоном разработки является разделение кода, который работает непосредственно с базами данных (уровень DAO), от кода, который обрабатывает данные (уровень сервисов). Это позволяет абстрагировать сервисы от конкретной реализации DAO и, при необходимости, менять эти реализации без изменения кода сервисов.

Ключевой частью нашего DAO класса является объект SessionFactory, который Spring самостоятельно внедряет в класс.

Использование JPA в приложении

Наконец, напишем сервис который будет использовать DAO, определённый выше, и делать что-нибудь с этими данными.

Обратите внимание, что тест сервиса проверяет только сервис, заменяя GreeterDao его подделкой. В то время как тесты DAO являются интеграционными и работают непосредственно с базой.

Поскольку я писал код сразу с модульными и интеграционными тестами, то у меня есть некоторая уверенность, что он работает, но, тем не менее, попробуем его запустить:

Код примера доступен на github