Spring MVC, JPA и Hibernate. Настройки JPA и ORM, создание сущностей, выполнение запросов к БД

Подключение ORM (Hibernate) в приложение Spring MVC. Настройки JPA и ORM, создание сущностей, выполнение запросов к БД.

Обзор приложения Spring MVC + AngularJS + Bootstrap + HTML5
Используемые технологии и библиотеки
  • Spring MVC 4.2.4.Release
  • Hibernate 5.0.1.Final
  • Spring Data 1.9.1.Release
  • Maven 3.2.5
  • IntelliJ IDEA 15.0.2

1. Описание задачи

В продолжении темы об использовании JDBC рассмотрим использование стандарта JPA и его реализации Hibernate 5. Подключим необходимые зависимости для использования JPA в Spring MVC и Hibernate. Создадим несколько сущностей и сделаем простые запросы к базе данных.

Отдельно отмечу, что работа Hibernate и Spring описана в разделе Spring DATA.

2. Структура проекта

hibernateProjectStructure

Для работы с Hibernate в этой части были добавлены только два класса — ORMController и ORMService. Первый обрабатывает запросы и перенаправляет к сервис классу, который непосредственно работает с базой данных и классами-сущностями. В качестве объектов базы данных используется класс User.

3. Подключение зависимостей pom.xml

Для подключения Hibernate 5 в Spring MVC были добавлены следующие зависимости:

Непосредственно библиотека Hibernate, вспомогательные классы (например для использования аннотации @NotEmpty), а так же зависимости spring-data.

полный файл pom.xml:

4. Настройки Spring MVC для использования ORM

Основные настройки для работы с JPA и Hibernate были записаны в application-context.xml.

Вначале задается источник данных (dataSource), который в нашем случае является in-memory базой данных H2. Настройки для url, username берутся из файла util.properties (задается строчкой выше <context:property-placeholder location=»classpath:util.properties» />). Главной частью этой статьи является описание бина entityManagerFactory. В свойствах (property) указываются: пакеты для сканирования\поиска сущностей (маппят классы на таблицы); источник данных — dataSource; JPA адаптер — HibernateJpaVendorAdapter и два необязательных свойства (generateDdl и showSql); далее свойства подключения jpa к базе данных (аналогично как это было для ранее рассмотренного случая работы с JDBC). В конце был подключен менеджер транзакций.

Важно — в mvc-config.xml прописана строчка  <tx:annotation-driven/>. Без нее аннотация @Transactional работать не будет.

Полный application-context.xml с настройками из предыдущих частей:

4.1 mvc-config.xml

Кроме включения транзакций и добавления в начале пространства имен этот конфигурационный файл не изменился.

5. web.xml

Здесь без изменений.

6. Java классы

Сначала опишу сервисный класс, который при вызове метода будет осуществлять запросы к базе данных.

Сервис класс ORMService

Класс помечен двумя аннотациями, что делает его бином и позволяет поддерживать запросы обновления или удаления данных (а так же другие возможности). Затем вначале внедряется с помощью аннотации @PersistenceContext объект EntityManager. Это основной интерфейс для выполнения операций с базами данных в JPA. Далее описаны различные методы, названия которых поясняют их назначение.

Класс контроллер ORMController

Обычный контроллер Spring MVC, в котором в методы передаются параметры из запросов. Эти параметры обрабатываться с помощью аннотации @PathVariable, а в URI обозначаются в фигурных скобках, например {userid}. Далее с помощью внедренного объекта класса ORMService мы получаем информацию из базы данных.

Класс сущность User

Класс помечен аннотациями, которые делают из него сущность и связывают его с таблицей с определенным названием. Внутри сущности используются аннотации для предварительной валидации, указания связывания свойства класса с определенной колонкой и т.д. Подробнее можете прочитать в разделе Hibernate. Обратите внимание, что Spring сможет связать этот класс с таблицей, т.к. он будет найден из указания настройки в application-context.xml (<property name = «packagesToScan» value = «ru.javastudy.mvcHtml5Angular.mvc.bean» />).

7. Представление jsp

Оно ничем не отличается от предыдущих статей. Описаны колонки слева для выбора действия и отображения результата в правой части страницы. Для тех кто не читал первые статьи, то здесь используется шаблонизатор (шаблон находится в пакете WEB-INF/tags).

8. База данных

Для этой статьи используются те же данные, что и для Spring MVC и JDBC (Spring JDBC example). Подключение и настройка JDBC datasource. Они будут доступны при скачивании исходных кодов для этой статьи внизу страницы. Напомню, что в dbschema.sql создаются таблицы (на старте приложения) и заполняются данными из test-data.sql.

9. Запуск и проверка работы приложения

Например, если нажать на Find All Users, то будет вызван метод ormFindAllUsers() из контроллера и возвращены все найденные пользователи.

hibernateMVCResult

 

Исходные коды

MVC_AngularJS_Html5 full project — полный проект Spring MVC + AngularJS + Bootstrap + HTML5.

6. Hibernate in Spring MVC — код для этой части

Обзор приложения Spring MVC + AngularJS + Bootstrap + HTML5
Share Button
11
15944 Total Views 5 Views Today

7 thoughts on “Spring MVC, JPA и Hibernate. Настройки JPA и ORM, создание сущностей, выполнение запросов к БД

  1. Mikhail:

    Добрый день!

    Может дать совет? По поводу Spring MVC

  2. Владимир:

    При запуске приложения возникает ошибка:

    Caused by: java.lang.RuntimeException: org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘entityManagerFactory’ defined in ServletContext resource [/WEB-INF/config/application-context.xml]: Invocation of init method failed; nested exception is java.lang.NoSuchMethodError: org.jboss.logging.Logger.debugf(Ljava/lang/String;I)V

    Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘entityManagerFactory’ defined in ServletContext resource [/WEB-INF/config/application-context.xml]: Invocation of init method failed; nested exception is java.lang.NoSuchMethodError: org.jboss.logging.Logger.debugf(Ljava/lang/String;I)V

    Помогите разобраться в чем дело.

    1. Владимир:

      Сам себе отвечу. Оказалось что в сервере jboss версия библиотеки jboss-logging была не та что нужно.

      прочитал здесь: http://stackoverflow.com/questions/32912773/nosuchmethoderror-org-jboss-logging-logger-debugf

      1. AlexFrei:

        Спасибо, была таже проблема

  3. Александр:

    Автор а как пользоваться не встроенной бд, а подключить базу данных из mysql workbanch?

    1. указать datasource с подключением к бд типа MySql. На этом и многих других сайтах это есть.

  4. Вячеслав:

    А как возможно сделать так, чтоб выводилась не вся информация а только по заданному ИД. Т.е. на странице сделать поле ввода ИД, а как его использовать не могу понять.

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