Главная

Популярная публикация

Научная публикация

Случайная публикация

Обратная связь

ТОР 5 статей:

Методические подходы к анализу финансового состояния предприятия

Проблема периодизации русской литературы ХХ века. Краткая характеристика второй половины ХХ века

Ценовые и неценовые факторы

Характеристика шлифовальных кругов и ее маркировка

Служебные части речи. Предлог. Союз. Частицы

КАТЕГОРИИ:






Взаимодействие с БД




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

/* пример # 9: инициализация mapping и подключение к БД: StudentDAO.java */

package com.hib;

import net.sf.hibernate.*;

public class StudentDAO {

//проверка на существование записи в базе данных

public static Boolean studentExists(String login) {

Session session =

ConnectionFactory.getOrInitSession();

Student _student = null;

try {

// создание запроса к БД

Query query =

session.createQuery(

" from Student a where a.login =:login ");

query.setParameter("login", login);

/*этот метод позволяет получать уникальные результаты. Необходимо обеспе­чить уникальность результатов на уровне БД, если используется данная функция */

_student = (Student) query.uniqueResult();

} catch (HibernateException e) {

e.printStackTrace();

ConnectionFactory.destroy();

} finally {

if (session!= null) {

try {

session.close();

} catch (HibernateException e) {

e.printStackTrace();

ConnectionFactory.destroy();

}

}

}

if (_student!= null) {

return new Boolean(true);

} else {

return null;

}

}

public static Student getStudent(String login,

String password) {

Session session =

ConnectionFactory.getOrInitSession();

Student _student = null;

try {

Query query =

session.createQuery(

"from Student a where a.login =:login");

query.setParameter("login", login);

_student = (Student) query.uniqueResult();

} catch (HibernateException e) {

e.printStackTrace();

ConnectionFactory.destroy();

} finally {

if (session!= null) {

try {

session.close();

} catch (HibernateException e) {

e.printStackTrace();

ConnectionFactory.destroy();

}

}

}

if (_student!= null) {

if (password.equals(_student.getPassword())) {

return _student;

} else

return null;

} else

return null;

}

//обновление учетной записи студента

//для возможности таких обновлений прописывался тег id в mapping

public static void updateStudent(Student _student) {

Session session =

ConnectionFactory.getOrInitSession();

try {

Transaction tx = null;

tx = session.beginTransaction();

session.update(_student);

tx.commit();

} catch (HibernateException e) {

e.printStackTrace();

tx.rollback();

ConnectionFactory.destroy();

} finally {

if (session!= null) {

try {

session.close();

} catch (Exception e) {

e.printStackTrace();

ConnectionFactory.destroy();

}

}

}

}

//добавление учетной записи студента

// в этом случае работает директива native из mapping

public static Boolean addStudent(Student _student) {

Session session =

ConnectionFactory.getOrInitSession();

try {

Transaction tx = null;

tx = session.beginTransaction();

session.save(_student);

tx.commit();

} catch (HibernateException e) {

e.printStackTrace();

tx.rollback();

ConnectionFactory.destroy();

return null;

} finally {

if (session!= null) {

try {

session.close();

} catch (Exception e) {

e.printStackTrace();

ConnectionFactory.destroy();

return null;

}

}

}

return new Boolean(true);

}

//удаление учетной записи студента

public static void deleteStudent(Student _student) {

Session session =

ConnectionFactory.getOrInitSession();

try {

Transaction tx = null;

tx = session.beginTransaction();

session.delete(_student);

tx.commit();

} catch (HibernateException e) {

e.printStackTrace();

tx.rollback();

ConnectionFactory.destroy();

} finally {

if (session!= null) {

try {

session.close();

} catch (Exception e) {

e.printStackTrace();

ConnectionFactory.destroy();

}

}

}

}

}

 

Класс SessionFactory относится к потокобезопасным классам, поэтому обычно его объект будет создаваться один раз и храниться в статической переменной. Если же возникли проблемы с базой данных, с пулом соединений либо
с освобождением ресурсов, которые хранятся в объекте SessionFactory, то, возможно, придется поддержать вышеприведенный подход.

Для управления Session используются два похода:

Session для каждой операции с базой данных, либо Session per request в контексте транзакции.

Начиная с версии 3.1, в Hibernate появился новый параметр hibernate.current_session_context_class, который может принимать одно из трех коротких значений, " jta ", " thread " и "managed",
либо классов, которые реализуют интерфейс org.hibernate.context.CurrentSessionContext и будут ответственны за открытие/закрытие сессии.

Если данный параметр установлен в конфигурационном файле, то в коде для получения сессии нужно только вызвать метод SessionFactory.getCurrentSession(),который либо вернет уже привязанную к данному контексту сессию, либо создаст новую.

Установив свойство в конфигурационном файле

<property name= "current_session_context_class">thread </property> метод deleteStudent() можно переписать следующим образом.

public static void deleteStudent(Student _student) {

 

Session session =

ConnectionFatory.sessionFactory

.getCurrentSession();

try {

Transaction tx = null;

tx = session.beginTransaction();

session.delete(_student);

tx.commit();

} catch (HibernateException e) {

e.printStackTrace();

tx.rollback();

}

}

 

В данном случае управление соединением будет производиться классом org.hibernate.context.ThreadLocalSessionContext,который будет использовать соединение, пока метод beginTransaction() не был вызван,
и соответственно отпустит соединение при вызове метода commit() либо rollback().






Не нашли, что искали? Воспользуйтесь поиском:

vikidalka.ru - 2015-2024 год. Все права принадлежат их авторам! Нарушение авторских прав | Нарушение персональных данных