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

Рассмотрим быстрый старт в Spring Data JPA. Создадим приложение Hello World с базовыми настройками Spring Data + JPA + Hibernate + MySQL.

Используемые технологии
  • Spring 4.1.5.RELEASE
  • Spring Data JPA Gosling Release
  • Hibernate 5.0.1.Final
  • JPA 2.1
  • MySQL 5.6.25
  • IntelliJ IDEA 14
  • Maven 3.2.5

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

Главное предназначение Spring Data JPA состоит в предоставлении дополнительных возможностей для разработки приложений с использованием Java Persistence API (JPA). В этой статье будет разобраны минимально необходимые настройки для запуска связки Spring Data JPA + JPA + Hibernate. Так же будет дано краткое описание абстракции Repository.

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

Spring Data JPA structure

В проекте три автоматически созданных файла с настройками: persistence.xml, spring-config.xml, pom.xml. Сгенерированные сущности для схемы javastudy (содержит 4 таблицы), интерфейс, его реализация и интерфейс ContactRepository.

3. Подключение базы данных MySQL в проект

На протяжении статей по Hibernate, JPA, Spring Data JPA используется одна и та же схема базы данных javastudy. Как подключить ее в проект подробно описано в создание MySQL базы данных и подключение к IntelliJ IDEA. Так выглядит база данных и данные в ней:

JPA Database

JPA contact JPA contact_hobby_det

JPA contact_tel_det JPA hobby

4. Подключение фреймворков

Создаем пустой проект maven:

maven start

4.1 Настройки pom.xml

Подключены библиотеки драйвера MySQL, библиотека Hibernate для использования с JPA, две минимально необходимых зависимости для Spring (AOP и Data). Для Spring Data JPA требуется библиотека Joda Time, так же подключена зависимость этой библиотеки для работы с Hibernate. В проект включена библиотека от Google guava — ее можно не включать, здесь используется просто для удобства создания массива и будет использована в других статьях.

4.2 Подключение Spring Data, Hibernate, JPA

add JPA,Hibernate, SpringData

Выделяем Spring Data JPA, Hibernate, Java EE Persistence. Должны быть предложены библиотеки из maven, если всё подключилось правильно и зависимости загрузились в репозиторий maven.

4.3. Настройка файла spring-config.xml

Важно! Файл spring-config.xml был перенесен в папку resources, т.к. при базовых настройках при компиляции проекта он не будет обнаружен в строчке:

Листинг spring-config.xml:

Подписи над каждой настройкой объясняют их суть.

4.4 Создание (автоматическая генерация сущностей)

Создавать каждую сущность для таблиц ручками нет смысла. Воспользуемся средствами среды разработки IntelliJ Idea:

create Entities

Был выбран вариант с аннотациями + добавление свойств колонок.

create Entities 2

4.5 Листинг классов сущностей

ContactEntity:

ContactHobbyDetailEntity:

ContactHobbyDetailEntityPK:

Здесь изменена на false первая строчка @Column(name = «contact_id», nullable = false, insertable = false, updatable = false).

ContactTelDetailEntity:

HobbyEntity:

Отметьте, что классы немного отличаются от созданных автоматически. Добавлены аннотации @ManyToOne, @ManyToMany, переопределены методы toString(). Для id указан тип не int, а Integer. Важно! Дата используется не sql.Date, а java.util.Date — смотрите аннотацию @Temporal(TemporalType.DATE).

5. Создание запросов к базе данных с помощью Spring Data JPA

Создадим интерфейс с методами поиска контактов:

ContactService:

Одной из основных концепций Spring Data является абстракция Repository. Эта абстракция репозитория представляет собой оболочку вокруг базового интерфейса JPA EntityManager и предлагает более широкие возможности для доступа к данным. Нам понадобится центральный интерфейс из Spring Data — org.springframework.data.repository.CrudRepository (рекомендую посмотреть методы этого интерфейса). Создадим свой интерфейс, расширяющий интерфейс CrudRepository:

В нем реализуем только два метода, т.к. findAll() уже входит в интерфейс CrudRepository.

Обратите внимание как названы методы. Это общее соглашение об именовании. Таким образом, при выполнении требований по названию методов, Spring Data JPA самостоятельно создаст запрос на основании имени метода. Например для findByFirstName(String firstName) будет создан запрос select c from ContactEntity where c.firstName = :firstName.

Реализация интерфейса ContactServiceImpl:

6. Тестирование приложения

Создан простой код для тестирования созданных методов для запроса к базе данных:

Вывод:

 

Ссылки для скачивания:

Spring Data JPA — Hello World

Spring Data JPA helloWorld SQL

Share Button
12
24101 Total Views 1 Views Today

9 thoughts on “Spring Data JPA — пример приложения Hello World. Настройки Spring Data + JPA + Hibernate + MySQL.

  1. Boris:

    Делаю все по подобию этой статьи, только DAO одно на всех, т.е. из абстрактного класса.

    public static void main(String[] args) {
    GenericXmlApplicationContext ctx = new GenericXmlApplicationContext();
    ctx.load(«classpath:applicationContext.xml»);
    ctx.refresh();

    UserDao userDao = ctx.getBean(«userDaoService», UserDao.class);
    User user = new User();
    user.setId(01L);
    user.setName(«Ivan»);
    user.setPassword(«222333»);
    userDao.create(user);

    }

    @Service(«userDaoService»)
    @Repository
    @Transactional
    public class UserDao extends AbstractDao<User>{

    public UserDao(){super(User.class);}
    }

    Ругается:

    Exception in thread «main» org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named ‘userDaoService’ is defined

    в чем может быть причина?

    1. Не задан бин с именем userDaoService. Скорее всего он не в контексте Spring (проверьте работает ли анотация Service).

  2. Дмитрий:

    Почему в качестве hibernate dialect используется H2? Правильней использовать

    или его subclasses в зависимости от используемой БД

    MySQL5DialectMySQLInnoDBDialectMySQLMyISAMDialect

    1. Убрал из текста. Не использовалась эта часть в коде (драйвер прописан в dataSource).

      1. Дмитрий:

        Почему это не используется? Разве диалект определяется по типу драйвера? Это неверно, например наше приложение использует jndi и в нём указан драйвер — в нашем же приложении hibernate его не видит, какой диалект он будет использовать?

         

        1. При инициализации всё определится автоматически. Логи загрузки приложения это хорошо показывают.
          Код в архиве в конце статьи менять не стал, так что можете поменять там диалект на MySQL сами или удалить вообще это свойство и оставить как в тексте из статьи.

          INFO: HHH000204: Processing PersistenceUnitInfo [
          name: default
          ...]
          июн 16, 2016 8:32:16 PM org.hibernate.Version logVersion
          INFO: HHH000412: Hibernate Core {5.0.1.Final}
          июн 16, 2016 8:32:16 PM org.hibernate.cfg.Environment
          INFO: HHH000206: hibernate.properties not found
          июн 16, 2016 8:32:16 PM org.hibernate.cfg.Environment buildBytecodeProvider
          INFO: HHH000021: Bytecode provider name : javassist
          июн 16, 2016 8:32:16 PM org.hibernate.annotations.common.reflection.java.JavaReflectionManager

          INFO: HCANN000001: Hibernate Commons Annotations {5.0.0.Final}

          июн 16, 2016 8:32:16 PM org.hibernate.dialect.Dialect
          INFO: HHH000400: Using dialect: org.hibernate.dialect.MySQL5Dialect

          июн 16, 2016 8:32:18 PM org.hibernate.hql.internal.QueryTranslatorFactoryInitiator initiateService
          INFO: HHH000397: Using ASTQueryTranslatorFactory

  3. Kaz:

    @Service(«jpaContactService»)
    @Repository
    @Transactional
    public class ContactServiceImpl implements ContactService {

    @Repository не обязательно использовать, т.к @Service уже создает Bean.

  4. alex:

    а можно пример web-проекта
    c spring, hibernate, mysql
    спасибо

    1. на сайте есть разные варианты. Посмотрите в Spring MVC разделе.

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