Java. Object-oriented mapping. Работаем с чистым Hibernate без прямого использования JDBC.

Этот пост - продолжение предыдущего. Из него используются таблицы в базе.
Если hibernate еще не скачан - делаем это. http://www.hibernate.org/
Настраиваем eclipse, добавляя следующие либы
Создаем определения проецирования.
Сперва, попросим Hibernate получить и отправить объект book для нас. Для простоты, проигнорируем таблицы publisher и chapter. Создадим xml файл "Book.hbm.xml". Этот файл ни что иное, как определение проецирования для класса Book. Объекты book именуются "Persistent objects" или "Entites", потому что они могут быть сохранены в базе данных и могут представлять реальные сущности.
Любой хранимый объект должен иметь идентификатор. Он будет использован Hibernate для идентификации того, что объект уникальный. Мы выберем ISBN в роли идентификатора объекта Book.
Настройка Hibernate
Сперва необходимо установить настройки приложения. Например, какой тип объектов сохраняется? Какой тип баз данных используется? Как коннектиться к базе?
Перед тем, как использовать Hibernate для получения и сохранения объектов, сперва необходимо использовать следующий фрагмент кода для построения "session factory". Фабрика сессий - глобальный объект для обслуживания сессий в Hibernate. Сессия - это как подключение к базе для работы с хранимыми объектами.
Вместо использования addResource() для добавления файлов проецирования, можно использовать также addClass() для добавления классов.
Если в приложении содержатся сотни определений проецирования, можно запаковать их в jar файл и добавить в конфигурацию Hibernate.
Конфигурация через XML
Другой вариант настройки Hibernate - использование XML файлов. Мы создаем файл hibernate.cfg.xml в корне проекта.
В таком случае фрагмент кода для построения фабрики сессии может быть упрощен.
Получение и сохранение объектов
Открытие и закрытие сессий.
Как и в JDBC, есть несколько рутинных действий. Сперва просим у фабрики сессий открыть новую сессию для нас. После окончания работы, мы должны помнить о том, чтобы его закрыть.
Получение объектов
Задав идентификатор (в нашем случае ISBN), можно получить книгу из базы данных. Есть два варианта как это сделать:
или
![]() |
Разница между load() и get() заключается в том, что в случае, когда ID не может быть найден, load() выкинет исключение "org.hibernate.ObjectNotFoundException", в то время, как get() просто возвратит null. Второе различие состоит в том, что load() возвращает лишь прокси и база данных не будет затронута пока прокси не выполнится. get() затрагивает базу тут же. |
Язык. используемый в Hibernate называется Hibernate Query Language (HQL).
Например, следующий код запрашивает объекты book:
Если Вы уверены, что будет лишь одно совпадение объекта, можно использовать uniqueResult() для получения результата:
Транзакции.
Если у вас не одна команда, а набор, в таком случае лучше использовать транзакции. Если что-то пойдет не так во время обновления базы, транзакция откатиться назад и все изменения будут отменены.
Если Вы не хотите определять транзакции в приложении, вы можете установить значение autocommit в true (который по умолчанию false) в XML файле настроек.
В таком случае, любой апдейт будет вкомичен тут же.
![]() |
Единственное, что нужно помнить про автокоммиты - это то, что их необходимо сливать перед закрытием сессии. Проблема в том, что Hibernate не записывает изменения в базу сразу же. Вместо этого он выжидает набора команд для повышения производительности. |
Сохранение объектов
Для сохранения новосозданных объектов, можно использовать метод save().
Для обновления существующих объектов можно использовать метод update().
Для удаления существующего объекта, можно использовать метод delete().
Материалы, которые могут вас заинтересовать
- Ленивая инициализация или Lazy Initialization в Hibernate
- Hibernate. Object-oriented mapping. Основы. Пример с использованием HSQLDB
- Нуждается ли приложение в сервере приложений? / Deciding Whether an Application Needs an Application Server
- Как происходит вызов EJB?
- В чем разница между EJB 2.0 и EJB 3.0?
- Можно ли вызывать Runtime.gc() в EJB?
- Что такое deployment descriptor или дескриптор развертывания?
- Являются ли JavaBeans компонентами J2EE?
- Какие существуют компоненты в J2EE?








Отправить комментарий