Руководство по Hibernate. Сессии.

В этой статье я решил более подробно остановиться на сессиях (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.