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