ІнтерфейсQuery має наступні методи:
list () - виконує запит, результат повертається в колекції List;
executeUpdate () - для виконання вилучень, змін, що застосовуються до численних об'єктів;
session.createQuery ( "delete from Company where status = 'closed'"). executeUpdate ();
setString (int index, String value). setDate () і т. д. -
встановлює параметр в запит за індексом;
session.createQuery ( "delete from Company where status =?"). setString (0, 'closed'). executeUpdate ();
також можна встановити параметр на ім'я:
session.createQuery ( "delete from Company where status =: stat"). setString ( 'stat', 'closed'). executeUpdate ();
iterate () - повертає Iterator за результатами запиту
Iterator it = createQuery ( "from Company"). Iterate ();
Довгоживучі Об'єкти і Колекції (Persistent Objects and Collections) - це однопоточні, короткоживучі об'єкти, що містять зберігається стан
і бізнес-функції. Це можуть бути звичайні JavaBean / POJO (Plain Old Java Objects) об'єкти, їх відмінна риса - це те, що вони асоційовані з однією сесією (Session). Як тільки їх сесія закрита, ці об'єкти стають від'єднаними і вільними для використання на будь-якому рівні додатку, наприклад, безпосередньо як об'єкти передачі даних на рівень представлення і з нього.
Тимчасові Об'єкти і Колекції (Transient Objects and Collections) - це екземпляри довгоживучих класів, які в даний момент не асоційовані
з сесією (Session). Це можуть бути об'єкти, створені додатком і в даний момент ще не перекладені в довгоживучі стан.
Транзакція net.sf.hibernate.Transaction - однопотоковий, короткоживучий об'єкт, який використовується додатком для вказівки атомарної одиниці виконуваної роботи. Він відволікає додаток від нижчих JDBC, JTA або CORBA транзакцій. У деяких випадках одна сесія (Session) може породити декілька транзакцій:
commit () - фіксує транзакцію бази даних;
rollback () - примушує транзакцію повертатися назад.
Інтерфейс net.sf.hibernate.connection.ConnectionProvider-постачальник з'єднань, фабрика і пул для JDBC-з'єднань. Абстрагує додаток від нижчих об'єктів Datasource або DriverManager. Внутрішній об'єкт Hibernate недоступний для додатка, але може бути розширений або реалізований розробником. методи:
close () - звільняє всі ресурси, які займає постачальником з'єднання;
closeConnection (Connection conn) - закриває використовується з'єднання;
configure (Properties props) - ініціалізує постачальника з'єднань з переданих властивостей.
Фабрика транзакцій net.sf.hibernate.TransactionFactory - фабрика для примірників класу Transaction. Внутрішній об'єкт Hibernate недоступний для додатка, але також може бути розширений або реалізований розробником.
beginTransaction (SessionImplementor session) - починає транзакцію і повертає її об'єкт.
Найпростіше застосування оголошених вище класів при додаванні
в сервлет реалізацій методів generateAndExecuteCreationScript ()
і createProperties () виглядає наступним чином:
/ * Приклад # 5: найпростіше застосування hibernate. MainServlet.java * /
Очевидно, що якщо сервлет при кожному зверненні до нього буде створювати заново об'єкт SessionFactory, то цей процес буде дуже трудомістким і з точки зору продуктивності системи, і з точки зору розробника при подальшому розширенні системи. Тому слід створити клас, завданнями якого буде створення і необхідна ініціалізація об'єктів Configuration, SessionFacroty і один з методів класу буде повертати готовий об'єкт Session. Отже, в методі сервлету для виведення вмісту таблиць бази даних на екран можна використовувати готовий об'єкт Session і з нього завантажити цікавлять параметри.
Використовуючи задану вище послідовність, для ініціалізації mapping-файлів і для коректного маніпулювання з'єднанням з базою даних створюється клас ConnectionFactory. Було відмічено, що в деяких версіях hibernate, незважаючи на директиву autoReconnect = true. автоматичне пере-підключення до БД відбувається з другого разу, тобто підключення відбувається відразу ж, але з'являється виняток про неможливість підключитися до БД.
/ * Приклад # 8: ініціалізація mapping і підключення до БД:
Даний клас перевіряє наявність підключення до БД і зберігає час перевірки. Якщо на момент перевірки клас «простоює» більше 10 хвилин, то йде повторне підключення до бази даних. У разі видалення класу він запобігає витоку пам'яті. Хоча в Hibernate є кошти для того, щоб виключити необхідність підключати кожен hbm.xml файл окремо, все ж краще це робити вручну, щоб уникнути зазначених вище помилок.
Цей клас обробляє помилки, які виникали на практиці при роботі c Hibernate, JDBC драйвером MySQL і сервером баз даних MySQL.
Взаємодія з БД
При роботі з базою даних зручно функції маніпулювання з об'єктами збирати воєдино і створювати менеджери транзакцій.
/ * Приклад # 9: ініціалізація mapping і підключення до БД. StudentDAO.java * /
public class StudentDAO
// перевірка на існування запису в базі даних
public static Boolean studentExists (String login)
Student _student = null;
// створення запиту до БД
"From Student a where a.login =: login");
/ * Цей метод дозволяє отримувати унікальні результати. Необхідно забезпе-чити унікальність результатів на рівні БД, якщо використовується дана функція * /
_student = (Student) query.uniqueResult ();
> Catch (HibernateException e)
Клас SessionFactory відноситься до потокобезпечна класах, тому зазвичай його об'єкт буде створюватися один раз і зберігатися в статичної змінної. Якщо ж виникли проблеми з базою даних, з пулом з'єднань або
із звільненням ресурсів, які зберігаються в об'єкті SessionFactory. то, можливо, доведеться підтримати вищенаведений підхід.
Для управління Session використовуються два походу:
Session для кожної операції з базою даних, або Session per request в контексті транзакції.
Починаючи з версії 3.1, в Hibernate з'явився новий параметр hibernate.current_session_context_class. який може приймати одне з трьох коротких значень, "jta", "thread" і "managed",
або класів, які реалізують інтерфейс org.hibernate.context.CurrentSessionContext і будуть відповідальні за відкриття / закриття сесії.
Якщо даний параметр встановлено в файлі конфігурації, то в коді для отримання сесії потрібно тільки викликати метод SessionFactory.getCurrentSession (), який або поверне вже прив'язану до даного контексту сесію, або створить нову.
Встановивши властивість в конфігураційному файлі
public static void deleteStudent (Student _student)
Transaction tx = null;
> Catch (HibernateException e)
В даному випадку управління з'єднанням буде проводитися класом org.hibernate.context.ThreadLocalSessionContext, який буде використовувати з'єднання, поки метод beginTransaction () він не був набраний,
і відповідно відпустить з'єднання при виклику методу commit () або rollback ().
Запуск з-під Apache Ant
Для того щоб запустити проект з-під Apache Ant, необхідно, щоб папки проекту були організовані в такий спосіб:
Файл build.xml служить керівництвом до дії для Ant. Спочатку він повинен виглядати наступним чином: