Configuration, session і sessionfactory

Нижче буде наведено кілька варіантів конфігурації Hibernate. Конфігурація або вiдтворення (mapping) зазвичай здійснюється один раз
протягом роботи програми. Конкретна конфігурація міститься в об'єкті класу net.sf.hibernate.cfg.Configuration.

private Configuration createConfiguration ()

throws ClassNotFoundException, MappingException

new Configuration () .addClass (Class.forName ( "courses.hiber.Course"))

Цей метод створює нову конфігурацію і додає в неї класи courses.hiber.Course і courses.hiber.Student (дане додавання необхідно тільки в тому випадку, якщо mapping-файли не були вказані в файлі конфігурації Hibernate). Hibernate шукає mapping за принципом, зазначеному вище. У конфігурацію могли бути також додані інші джерела mapping, наприклад потік, jar-файл, org.dom4j.Document. Метод addClass () повертає об'єкт Configuration. тому він викликається кілька разів поспіль. Далі додається в додаток метод, що генерує по конфігурації таблиці в базі даних.

Hibernate містить консольний додаток для генерації скриптів. У наведеному нижче коді об'єкт класу SchemaExport генерує таблиці бази даних по налаштованому mapping і заданим властивостям, записує текст
в файл (c: /temp/courses_script.sql) і виконує згенерований SQL-код.

private void generateAndExecuteCreationScript (Configuration configuration, Properties properties) throws HibernateException

SchemaExport export = new SchemaExport (configuration, properties);

export.setOutputFile ( "c: \\ temp \\ courses_script.sql") .create (true. true);

У методі create (true, true) генерується script-текст для створення таблиць і надсилається на консоль (визначається першим параметром - true), і на його основі створюються таблиці в базі даних (другий параметр - true).

Session - це інтерфейс, який використовується для збереження в базу даних і відновлення з неї об'єктів класів Course і Student. SessionFactory - потокобезпечна, незмінний кеш відкомпільованих mapping для однієї бази даних, фабрика для створення об'єктів Session.

1. Створюється об'єкт SessionFactory

SessionFactory factory = new Configuration () .configure (). BuildSessionFactory ();

Метод configure () класу Configuration заносить інформацію
в об'єкт Configuration з конфігураційного файлу Hibernate;

2. Створюється сесія

Session session = factory.openSession ();

3. Витягуються всі рядки з таблиць course і student. текст запитів
і команд пишеться на Hibernate-діалекті. Він схожий на SQL, тільки в якості сутностей-носіїв даних виступають класи, а не таблиці.

List courses = session.find ( "from Course");

List students = session.find ( "from Student");

4. В кінці звернення сесія закривається.

Інтерфейс net.sf.hibernate.SessionFactory містить ряд необхідних методів:

openSession () - створює з'єднання з базою даних і відкриває сесію. Як параметр може бути передано і з'єднання, тоді буде створена сесія за існуючим з'єднанню;

close () - знищення SessionFactory і звільнення всіх ресурсів, використовуваних об'єктом.

Інтерфейс net.sf.hibernate.Session - однопотоковий, короткоживучий об'єкт, що є посередником між додатком і сховищем довгоживучих об'єктів, використовується для навігації по об'єктному графу або для пошуку об'єктів за ідентифікатором. По суті, є класом-оболонкою навколо JDBC-з'єднання. У той же час являє собою фабрику для об'єктів Transaction.

load (Class theClass, Serializable id) - повертає об'єкт даного класу з зазначеним ідентифікатором;

load (Object object, Serializable id) - завантажує постійний стан об'єкта з зазначеним ідентифікатором в об'єкт, покажчик якого був переданий;

save (Object object [, Serializable id]) - зберігає переданий об'єкт. Якщо переданий ідентифікатор, то використовує його;

update (Object object [, Serializable id]) - оновлює постійний об'єкт за ідентифікатором об'єкта, а якщо переданий ідентифікатор, то оновлює об'єкт із зазначеним ідентифікатором;

saveOrUpdate (Object object) - в залежності від значення ідентифікатора зберігає або оновлює об'єкт;

get (Class class, Serializable id) - повертає об'єкт дан-ного класу, із зазначеним ідентифікатором або null. якщо такого об'єкта немає;

delete (Object object) - видаляє об'єкт з бази даних;

delete (String query) - видаляє всі об'єкти, отримані за запитом. Можливий і виклик запиту з параметрами delete (String query,
Object [] objects, Type [] types);

Transaction beginTransaction () - починає одиницю роботи
і повертає асоційовану транзакцію.

Для здійснення запитів використовується екземпляр інтерфейсаorg.hibernate.Query. Отримати його можна за допомогою об'єкта Session:

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

Схожі статті