Руководство по Hibernate. Руководство по Hibernate
![]()
|
Конфигурирование.Для корректной работы, мы должны передать Hibernate подробную информацию, которая связывает наши Java-классы c таблицами в базе данных (далее – БД). Мы, также, должны укзать значения определённых свойств Hibernate. обычно, вся эта информация помещена в отдельный файл, либо XML-файл – hibernate.cfg.xml, либо – hibernate.properties. В этой статье мы рассмотрим конфигурирование приложение с помощью XML-файла hibernate.cfg.xml. Для начала рассмотрим ключевые свойства, которые должны быть настроены в типичном приложении: hibernate.dialect Указывает HIebrnate диалект БД. Hibernate, в своб очередь, генерирует необходимые SQL-запросы (например, org.hibernate.dialect.MySQLDialect, если мы используем MySQL). hibernate.connection-driver_class Указывает класс JDBC драйвера. hibernate.connection.url Указывает URL (ссылку) необходимой нам БД (например, jdbc:mysql://localhost:3306/database). hibernate.connection.username Указывает имя пользователя БД (например, root). hibernate.connection.password Укащывает пароль к БД (например, password). hibernate.connection.pool_size Ограничивает количество соединений, которые находятся в пуле соединений Hibernate. hibernate.connection.autocommit Указывает режим autocommit для JDBC-соединения. Давайте рассмотрим пример конфигурационного XML-файла. Исходные данные: Тип БД: MySQL Имя базы данных: database Имя пользователя: root Пароль: password "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> name="hibernate.dialect"> org.hibernate.dialect.MySQLDialect name="hibernate.connection.driver_class"> com.mysql.jdbc.Driver name="hibernate.connection.url"> jdbc:mysql://localhost/database name="hibernate.connection.username"> root name="hibernate.connection.password"> password Сессии. В этой статье я решил более подробно остановиться на сессиях (Session). Напомню, что сессия используется для получения физического соединения с базой данных (далее – БД). Благодаря тому, что сессия является легковесны объектом, его создают (открывают сессию) каждый раз, когда возникает необходимость, а потом, когда необходимо, уничтожают (закрывают сессию). Мы создаём, читаем, редактируем и удаляем объекты с помощью сессий. Мы стараемся создавать сессии при необходимости, а затем уничтожать их из-за того, что ни не являются потоко-защищёнными и не должны юыть открыты в течение длительного времени. Экземпляр класса может находиться в одном из трёх состояний: transient Это новый экземпляр устойчивого класса, который не привязан к сессии и ещё не представлен в БД. Он не имеет значения, по которому может быть идентифицирован. persistent Мы модем создать преходный экземпляр класса, связав его с сессией. Устойчивый экземпляр класса представлен в БД, а значение идентификатора связано с сессией. detached После того, как сессия закрыта, экземпляр класса становится отдельным, независимым экземпляром класса. В примитивном виде, транзакция выглядит примерно таким образом: Session session = sessionFactory.openSession(); Transaction transaction = null; try{ transaction = session.beginTransaction(); /** * Here we make some work. * */ transaction.commit(); }catch(Exception e){ if(transaction !=null){ transaction.rollback(); e.printStackTrace(); } e.printStackTrace(); }finally{ session.close(); } В этом примере, в случае исключения, происходит откат (rollback). В интерфейсе Session определены 23 метода, которые мы можем использовать: Transaction beginTransaction() Начинает транзакцию и возвращает объект Transaction. void cancelQuery() Отменяет выполнение текущего запроса. void clear() Полностью очищает сессию Connection close() Заканчивает сессию, осовождает JDBC-соединение и выполняет очистку. Criteria createCriteria(String entityName) Создание нового экземпляра Criteria для объекта с указанным именем. Criteria createCriteria(Class persistentClass) Создание нового экземпляра Criteria для указанного класса. Serializable getIdentifier(Object object) Возвращает идентификатор данной сущности, как сущности, связанной с данной сессией. void update(String entityName, Object object) Обновляет экземпляр с идентификатором, указанном в аргументе. void update(Object object) Обновляет экземпляр с идентификатором, указанном в аргументе. void saveOrUpdate(Object object) Созраняет или обновляет указанный экземпляр. Serializable save(Object object) Сохраянет экземпляр, предварительно назначив сгенрированный идентификатор. boolean isOpen() Проверяет открыта ли сессия. boolean isDirty() Проверят, есть ли в данной сессии какие-либо изменения, которые должны быть синхронизованы с базой данных (далее – БД). boolean isConnected() Проверяет, подключена ли сессия в данный момент. Transaction getTransaction() Получает связанную с этой сессией транзакцию. void refresh(Object object) Обновляет состояние экземпляра из БД. SessionFactory getSessionFactory() Возвращает фабрику сессий (SessionFactory), которая создала данную сессию. Session get(String entityName, Serializable id) Возвращает созранённый экземпляр с указанными именем сущности и идентификатором. Если таких сохранённых экземпляров нет – возвращает null. void delete(String entityName, Object object) Удаляет сохранённый экземпляр из БД. void delete(Object object) Удаляет сохранённый экземпляр из БД. SQLQuery createSQLQuery(String queryString) Создаёт новый экземпляр SQL-запроса (SQLQuery) для данной SQL-строки. Query createQuery(String queryString) Создаёт новый экземпляр запроса (Query) для данной HQL-строки. Query createFilter(Object collection, String queryString) Создаёт новый экземпляр запроса (Query) для данной коллекции и фильтра-строки. В этой статье мы ознакомились с основными понятиями, связанными с объектом Session. Сохраняемые классы. Ключевая функция Hibernate заключается в том, что мы можем взять занчения из нашего Java-класса и созранить их в таблице базы данных (далее – БД). С помощью конфигурационных файлов мы указываем Hibernate как извлечь данные из класса и соединить с определённым столбцами в таблице БД. Если мы хотим, чтобы экземпляры (объекты) Java-класса в будущем созранялся в таблице БД, то мы называем их “сохранямые классы” (persistent class). Для того, чтобы сделать работу с Hibernate аксимально удобной и эффективной, мы следует использовать программную молель Простых Старых Java Объектов (Plain Old Java Object – POJO). Сущесвуют определённые требования к POJO классам. Вот самые главные из них: Все классы должны иметь ID для простой идентификации наших объектов в БД и в Hibernate. Это поле класса соединяется с первичным ключём (primary key) таблицы БД. Все POJO – классы должны иметь конструктор по умолчанию (пустой). Все поля POJO – классов должны иметь модификатор доступа private иметь набор getter-ов и setter-ов в стиле JavaBean. POJO – классы не должны содержать бизнес-логику. Мы называем классы POJO для того, чтобы подчеркнуть тот факт, что эти объекты являются экземплярами обычных Java-классов. Ниже приведён пример POJO – класса, которые соотвтетствует условиям, написанным выше: package net.proselyte.hibernate.pojo; public class Developer { private int id; private String firstName; private String lastName; private String specialty; private int experience; /** * Default Constructor */ public Developer() { } /** * Plain constructor */ public Developer(int id, String firstName, String lastName, String specialty, int experience) { this.id = id; this.firstName = firstName; this.lastName = lastName; this.specialty = specialty; this.experience = experience; } /** * Getters and Setters */ public int getId() { return id; } public void setId(int id) { this.id = id; } public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public String getSpecialty() { return specialty; } public void setSpecialty(String specialty) { this.specialty = specialty; } public int getExperience() { return experience; } public void setExperience(int experience) { this.experience = experience; } /** * toString method (optional) */ @Override public String toString() { return "Developer{" + "id=" + id + ", firstName='" + firstName + '\'' + ", lastName='" + lastName + '\'' + ", specialty='" + specialty + '\'' + ", experience=" + experience + '}'; } } В этой статье мы рассмотрели основные понятия созраняемых классов (persistent classes). Соединяющие файлы. Чаще всего, когда мы имеем дело с ORM фреймворком, связи между объектами и таблицами в базе данных (далее – БД) указываются в XML – файле. Давайте рассмотрим наш предыдущий POJO – класс Developer.java package net.proselyte.hibernate.pojo; public class Developer { private int id; private String firstName; private String lastName; private String specialty; private int experience; /** * Default Constructor */ public Developer() { } /** * Plain constructor */ public Developer(int id, String firstName, String lastName, String specialty, int experience) { this.id = id; this.firstName = firstName; this.lastName = lastName; this.specialty = specialty; this.experience = experience; } /** * Getters and Setters */ public int getId() { return id; } public void setId(int id) { this.id = id; } public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public String getSpecialty() { return specialty; } public void setSpecialty(String specialty) { this.specialty = specialty; } public int getExperience() { return experience; } public void setExperience(int experience) { this.experience = experience; } /** * toString method (optional) */ @Override public String toString() { return "Developer{" + "id=" + id + ", firstName='" + firstName + '\'' + ", lastName='" + lastName + '\'' + ", specialty='" + specialty + '\'' + ", experience=" + experience + '}'; } } Тперь создадим таблицу в БД под названием HIBERNATE_DEVELOPERS: CREATE TABLE HIBERNATE_DEVELOPERS( ID INT NOT NULL AUTO_INCREMENT, FIRST_NAME VARCHAR(50) DEFAULT NULL, LAST_NAME VARCHAR(50) DEFAULT NULL, SPECIALTY VARCHAR(50) DEFAULT NULL, EXPERIENCE INT DEFAULT NULL, PRIMARY KEY(ID) ); На данный момент у нас есть две независимых друг от друга сущности: POJO – класс Developer.java и таблица в БД HIBERNATE_DEVELOPERS. Для того, чтобы связать их друг с другом и получить возможность сохранять значения полей класса, нам необходимо объяснить, как именно это делать Hibernate фреймворку. ЧТобы это сделать, мы создаём конфигурационной XML – файл Developer.hbm.xml Вот этот файл: "-//Hibernate/Hibernate Mapping DTD//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> This class contains developer's details. На данный момент мы ещё не можем сказать, что наше приложение готово, но у нас есть часть необходимых конфигураций. Давайте разберем их. Опциональный (необязательный) тег, внутри которого мы можем добавить описание класса. Мы используем этот тег для того, чтобы связать (map) конкретное поле POJO – класса с конкретной колонкой в таблице БД. Свойство name указывает поле в классе, в то время как свойство column указывает на колонку в таблице БД. Свойство type указывает тип связывания (mapping) и конвертирует тип данных Java в тип данных SQL. Существуют также и другие теги, которые могут быть использованы в конфигурационном XML – файле, которые не были указаны в этой теме. Но в течение всего цикла статей, посвящённых Hibernate, мы постараемся поговорить о большинстве из них. А в этой статье мы ознакомились с основами применения созединящих файлов (mapping files). |