Работаем с Hibernate.

В этом уроке хотелось бы Вас познакомить с таким популярным Java-фреймворком, как Hibernate. этот фреймворк используется для решения задачи объектно-реляционного отображения(Object Relation Mapping) простых объектов Java в записи реляционной Базы данных. Этот подход позволяет программисту абстрагироваться от низкоуровневого программирования на языке SQL и уменьшает время разработки, так как программист не занимается вручную написанием множества строк SQL-кода.

Давайте чуть подробнее разберем саму идею и концепцию ORM, а затем вновь вернемся к Hibernate.

Итак, как мы уже говорили, суть ORM в отображении или маппинге объектов в записи реляционной БД. Сама концепция объектно-ориентированного программирования строится на понятии объекта. Все вокруг объекты. Преимущество самой идеи использования ORM уже состоит в том, что она позволяет нам работать с объектами, а не с обычными записями в таблице БД. Предположим, что мы храним данные о заказах в магазине. Каждый заказ обладает рядом свойств: наименование, стоимость, дата изготовления и так далее. Используя ORM, мы не опускаемся ниже на один уровень абстракции и не идем писать кучу шаблонного кода для различных типов выборки, а продолжаем работать с привычными нам объектами, сохраняя все их свойства и возможные связи с другими объектами. В концепции ORM такие объекты называют хранимыми или персистентными(от англ. persistent). И именно абстракция является главным мощным преимуществом ORM.

Конечно, на деле не все так прекрасно. Ввиду того, что использование ORM – по сути есть прослойка между бизнес-логикой приложения и работой с РБД, то это создает некоторые накладные расходы. Однако писать высоко оптимизированный SQL-код под силу далеко не каждому, в то время как ORM это может сделать за Вас, причем гораздо эффективнее.

 

Но вернемся к Java и Hibernate.

Hibernate – это реализация спецификации JPA(Java Persistence API). Этот API содержится в пакете javax.persistence и поставляется с Java SE и Java EE, начиная с версии Java 5.

Итак, напишем первое приложение с использованием ORM Hibernate. Пусть БД будет содержать записи о ваших любимых книгах и содержит такие столбцы, как: название, автор и год издания. Для работы с Hibernate библиотеку необходимо подключить. Лично я использую Maven в качестве сборщика и мне необходимо лишь добавить необходимые зависимости.

Для начала реализуем POJO-класс Book, представляющий отдельную книгу в рамках нашей модели.

 

Аннотацией @Entity помечается наш POJO-класс для связывания с БД. Аннотации @Table и @Column указывают на необходимую таблицу и ее столбцы соответственно. Параметры и их значения прописываются в скобках после указания самой аннотации.

Аннотация @Id указывают на поле, являющееся уникальным идентификатором. А с помощью аннотаций @GeneratedValue и @GenericGenerator задаем способ формирования новых ключей.

Далее, пользуясь паттерном DAO(Data Access Object), напишем интерфейс, для операций над нашими сущностями, такими как добавление, удаление и выборка.

Затем создадим новый файл BookDAOImpl для реализации нашего интерфейса. В название класса мы добавили сокращение Impl(от слова implementation – реализация). Использование такого имени вовсе необязательно, однако является правилом хорошего тона. Не забывайте, что  чаще всего вы пишите код не только для самого себя!

Рассмотрим этот код. Для создания новой сессии получаем объект типа  SessionFactory путем вызова метода getSessionFactory класса HibernateUtil и вызываем метод openSession(). Реализацией класса HibernateUtil мы займемся чуть позже. Далее начинаем новую транзакцию, сохраняем новое слово и подтверждаем транзакцию. Для обработки ошибок используются исключения. После окончания работы с текущей сессией, ее необходимо закрыть.

 

Следующие два метода работаю по тому же принципу с одним лишь отличием, что для обновления записи в БД мы используем метод session.update(), а для получения объекта из БД – метод session.load().

 

В данном методе получим все записи, хранящиеся в БД. Естественно, в виде объектов, которые мы сохраним в ArrayList<Word>.

Далее создадим класс-фабрику для предотвращения создания множественных соединений для работы с базой данных. Желательно, чтобы в вашем приложении для подключения к Базе данных при каждой операции не создавалось новое соединение, а использовалось одно единственное, создание которого инициируется в самом начале работы. Данные критерии могут быть удовлетворены при использовании еще одного паттерна, так называемого Singleton. Как видите, паттерны очень важны для разработчика  и их знание, а также умение применять на практике, не менее необходимы для Вас, чем написание самого кода, так как именно на использовании основных паттернов строится большинство современных фреймворков. Описание паттерна Singleton вы можете прочесть в отдельной статье. А код нашего класса-фабрики приведен ниже.

Теперь необходимо настроить соединение с базой данных. Для этого создаим новый пакет, назовем его util и в нем создадим новый класс HibernateUtil, в котором будем получать объект типа HibernateSession. Он понадобится нам для создания новых сессий.

На этом все. Осталось протестировать весь функционал, реализуя операции добавления новых объектов в методе main. После добавления нескольких объектов можно вывести их на экран.

Первое знакомство с библиотекой Hibernate ORM на этом можно считать законченным. Но это не последний урок по Hibernate. Поэтому следите за новостями!

комментарий

  1. Константин Ответить

    Здравствуйте. Спасибо за статью.
    Делал учебные Hibernate проекты по разным урокам и везде одна и та же ошибка — ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment].
    падает в файле HibernateUtil на этой строке sessionFactory = new Configuration().configure().buildSessionFactory();
    Что-только не делал. Весь Стэковерфлоу перерыл, ничего не помогает. База Оракл.
    Может сталкивался кто, подскажите, пожалуйста. делаю все без Hibernat пока, но надежда исправить ситуацию всё ещё теплится.
    P.S. по этому уроку то же исключение падает, код весь такой же.

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

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