Equery ( "from company")

Інтерфейс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 * /

Script was generated

Script was generated

Очевидно, що якщо сервлет при кожному зверненні до нього буде створювати заново об'єкт 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 (), який або поверне вже прив'язану до даного контексту сесію, або створить нову.

Встановивши властивість в конфігураційному файлі

thread метод deleteStudent () можна переписати таким чином.

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. Спочатку він повинен виглядати наступним чином:

Схожі статті