18115

Об’єктно-реляційні перетворення (O/RM – Object-relational mapping)

Контрольная

Информатика, кибернетика и программирование

Обєктнореляційні перетворення O/RM Objectrelational mapping //Реляційні бази даних; проблеми звязку реляційних БД з ООПпрограмами} Обєктноорієнтовані бази даних і СУБД ODBMS Object database management system Поряд з реляційними базами даних РБД в яких інформація зберігається у вигл...

Украинкский

2013-07-06

83 KB

4 чел.

Об’єктно-реляційні перетворення (O/RMObject-relational mapping)

{//Реляційні бази даних; проблеми зв’язку реляційних БД з ООП-програмами}

Об’єктно-орієнтовані бази даних і СУБД (ODBMS - Object database management system)

Поряд з реляційними базами даних (РБД), в яких інформація зберігається у вигляді прямокутних таблиць, існують об’єктно-орієнтовані бази даних. Вони стали результатом інтеграції баз даних з об’єктно-орієнтованими мовами програмування. ООБД зберігає об’єкти такими, якими вони є в програмах. ODBMS розширює можливості мов програмування прозорим зберіганням даних, керуванням паралельним доступом, можливостями відновлення даних, складного вибирання даних тощо. ООБД спроектовані спеціально для роботи з такого роду мовами програмування, як Java, C++, C# - в них використовується та ж об’єктна модель. Завдяки цьому можна досягти зниження витрат на розробку та підтримку програми, підвищити продуктивність програми.

Огляд об’єктно-реляційних перетворень (O/RMObject-relational mapping)

O/RM використовується для перетворення об’єктів мов об’єктно-орієнтованого програмування (таких, як Java, C++, C#) в реляційні структури баз даних і навпаки. O/RM-продукти надають мовам програмування об’єктний інтерфейс доступу до РБД, такий, як інтерфейс доступу до ООБД. Їх використання робить код меншим, полегшує програмування за рахунок "прозорого зберігання" (transparent persistence) {//пояснити поняття persistent object} і збільшує продуктивність за рахунок кешування в порівнянні з стандартними інтерфейсами доступу до баз даних, таких, як JDBC чи ODBC. (З точки зору продуктивності пряме використання SQL дає більшу продуктивність при використані складних запитів, в той час як O/RMпри використанні простих).

Об’єктно-реляційні системи вирішують проблему об’єктно-реляційних перетворень шляхом надання бібліотек класів, які здатні робити перетворення (mapping) автоматично. Отримуючи список таблиць в базі даних і об’єктів в програмі, вони автоматично перетворюють (маплять) запити з однієї форми в іншу. Наприклад, звернення до об’єкта спричиняє неявне формування і виконання відповідного запиту до бази даних. Таким чином, система бачиться як постійне сховище (хранилище, store) об’єктів – програміст створює об’єкти і працює з ними, і інформація автоматично попадає в БД. Хоча іноді доводиться відступати від даного стилю, наприклад, з міркувань ефективності.

Існують як безкоштовні, так і комерційні O/RM; часто програмісти створюють власні такого роду системи в рамках своїх проектів.

ORM-системи для Java:

  •  Java Persistence API (частина J2EE)
  •  Speedo, open source implementation of JDO (Java Data Objects)
  •  intelliBO by Signsoft, implementation of JDO
  •  JPOX, open source JDO 2 reference implementation
  •  Enterprise Objects Framework, Mac OS X/Java, part of Apple WebObjects 
  •  TopLink by Oracle
  •  CrossDB, open source
  •  Hibernate, open source
  •  iBATIS, maintained by ASF, and with .NET port.
  •  Hydrate, open source, relational/object/XML mapping tool
  •  Castor, open source, object/XML/relational mapping tool
  •  Cayenne, open source for java

Post-SQL бази даних і СУБД

Зараз існують так звані post-SQL СУБД, наприклад, Caché, ідентичні до звичайних O/RM, але мають власний двигун СУБД, оптимізований як для об’єктної, так і SQL роботи.

O/RM система Hibernate

JavaBeans.

Поняття JavaBeans визначається Sun Microsystems як "повторно-використотовувані програмні компоненти, які можуть маніпулюватися візуально в IDE-середовищі".

Для того, щоб вважатися JavaBean класом, клас повинен відповідати певним критеріям відносно назви методів, конструкторів і поведінки. Ці критерії дають можливість створювати програмні інструменти, що можуть використовувати, повторно використовувати, заміняти і підключати JavaBean'и.

Обов’язкові критерії такі:

  •  клас повинен бути serializable (здатний зберігатися на диску);
  •  в класі повинен бути конструктор без параметрів;
  •  його властивості повинні бути доступні через спеціальні get та set методи, які відповідають загальній системі іменування;
  •  він повинен мати всі необхідні методи обробки подій.

В найпростішому випадку розробники сприймають JavaBean'и як прості Java-класи, що відповідають певним правилам іменування.

Hibernate.

Hibernate є легковісним O/RM сервісом для Java. Легковісний означає, що він спроектований як нескладний для вивчення і використання, а також висуває невисокі вимоги до системних ресурсів в порівнянні з деякими іншими системами.

Hibernate може використовувати XML-документи (другий спосіб – використання анотаційних класів) для відображення зв’язку між таблицями БД і Java-класами, які проектуються у вигляді JavaBeans. Наведемо приклад такого файлу (файл Person.hbm.xml), який відображає таблицю БД, в якій зберігається інформація про людей.

1   <?xml version="1.0"?>

2   <!DOCTYPE hibernate-mapping

3      PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"

4  "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >

5    <hibernate-mapping>

6      <class name="readtable.Person" table="PERSON">

7         <id name="id" type="int" column="ID">

8            <generator class="increment"/>

9         </id>

10        <property name="surname" type="java.lang.String" not-null="true"/>

11        <property name="name" type="java.lang.String" not-null="true"/>

12        <property name="birthYear" type="int" column="BIRTH_YEAR"/>

13     </class>

14   </hibernate-mapping>

Відповідності повинні бути описані всередині тега <hibernate-mapping>. Рядок 6 показує, що мапиться таблиця PERSON в клас readtable.Person. Доцільно робити мапінг для одного класу в одному xml-файлі і розміщувати xml-файл в тій же папці, що і файл класу.

Далі описується зв’язок полів таблиці БД з властивостями класу Java. В hibernate первинний ключ повинен називатися id. В даному випадку так позначатиметься поле ID. Клас генератора "increment" (рядок 8) використовується зокрема для баз даних MySQL.

Далі йде опис властивостей, що відповідають іншим полям таблиці. Якщо назва поля таблиці БД та поля JavaBean класу співпадають, то задається тільки властивість name (рядки 10, 11), в іншому випадку потрібно задавати nameім’я поля JavaBean класу та columnім’я поля таблиці БД).

Відповідний JavaBean клас має такий вигляд:

package readtable;

public class Person {

 private int id;

 private String surname;

 private String name;

 private int birthYear;

 

 public int getId() {

 return id;

}

 public void setId(int id) {

 this.id = id;

}

 public String getSurname() {

 return surname;

}

 public void setSurname(String surname) {

 this.surname = surname;

}

 public String getName() {

 return name;

}

 public void setName(String name) {

 this.name = name;

}

 public int getBirthYear() {

 return birthYear;

}

 public void setBirthYear(int birthYear) {

 this.birthYear = birthYear;

}

 public boolean equals(Object other) {

 if (!(other instanceof Person) ) return false;

  Person castOther = (Person) other;

     return new EqualsBuilder()

             .append(this.getId(), castOther.getId())

             .isEquals();

}

 public int hashCode() {

    return new HashCodeBuilder()

            .append(getId())

            .toHashCode();

}

}

{Питання: Що в цьому класі є такого, що робить його Java-біном?}

Під’єднання до бази даних Firebird та читання інформації з бази

Розглянемо дане питання на прикладі.

package readtable;

import java.util.List;

import java.util.ListIterator;

import org.hibernate.Session;

import org.hibernate.SessionFactory;

import org.hibernate.cfg.Configuration;

public class Run {

 static Configuration config;

 static SessionFactory sf;

 static Session session;

 static List<Person> data;

 public static void main(String[] args){

 config=new Configuration();

 config.configure("/readtable/hibernate.cfg.xml");

 sf=config.buildSessionFactory();

 session=sf.openSession();

 data=session.createQuery("from readtable.Person").list();

 for (ListIterator<Person> iter=data.listIterator();iter.hasNext();){

 Person person=iter.next();

 System.out.println(person.getId()+" "+person.getSurname()+" "+person.getName()+" "+person.getBirthYear());

}

 }

}

Клас Configuration використовується для встановлення середовища hibernate. При використанні його методу configure шукається файл hibernate.cfg.xml. Приклад такого файлу:

<?xml version='1.0' encoding='utf-8'?>

<!DOCTYPE hibernate-configuration PUBLIC

"-//Hibernate/Hibernate Configuration DTD//EN"

"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>

<session-factory>

   <property name="connection.driver_class">

  com.mysql.jdbc.Driver

   </property>

   <property name="connection.url">

      jdbc:mysql://localhost:3306/simple_db?characterEncoding=utf8

   </property>

   <property name="connection.username">root</property>

   <property name="connection.password">admin</property>

   <property name="connection.pool_size">10</property>

   <property name="show_sql">true</property>

   <property name="dialect">org.hibernate.dialect.MySQL5Dialect</property>

   <property name="useUnicode">true</property>

   <property name="hibernate.hbm2ddl.auto">update</property>

   <!-- Mapping files -->

   <mapping resource="readtable/Person.hbm.xml"/>

</session-factory>

</hibernate-configuration>

Як видно, в файлі задаються параметри під’єднання до бази даних – драйвери сервера БД, файл бази, ім’я користувача, пароль.

Потім (секція <!-- Mapping files -->) іде запит мапінг-сервісу для класу Person – при цьому завантажується Person.hbm.xml.

Повернемося до програми. Після Configuration створюється SessionFactory, сенс якої в тому, щоб забезпечити програму об’єктами Session – головним "шляхом" для взаємодії з hibernate. Об’єкт SessionFactory потрібен лише один для програми. Створення SessionFactory досить витратна і повільна операція, тож має сенс розділяти один об’єкт між різними частинами програми.

Коли підходить час безпосередньої роботи з базою, від SessionFactory можна отримати об’єкт Session (сеанс), який встановлює зв’язок з базою даних і забезпечує контекст, в якому можна створювати, отримувати, маніпулювати і вилучати персистентні об’єкти (persistent objects). Протягом існування сеансу відслідковуються всі зміни до БД і вони зберігаються при закритті сеансу. Сеанси не повинні тривати довго (наприклад, очікуючи введення інформації користувачем). Як правило, Session відкривається для здійснення певної обмеженої операції і зразу ж після її виконання закривається. Наступна операція використовуватиме новий Session.

Запит до БД виконується в рядку

data=session.createQuery("from readtable.Person").list();

Запит написаний на мові HQL (Hibernate Query Language – побудована на SQL об’єктна мова запитів). Текст запиту починається з fromмається на увазі, що перед ним за змовчанням стоїть "select * ". Можна явно прописувати "select <список полів>", якщо потрібно вибрати не всі поля.

Потрібно також звернути увагу, що запит виражається в термінах промаплених Java-класів, а не термінів таблиць БД, наприклад, після from стоїть назва класу, а не таблиці БД. В HQL, як в SQL, можна використовувати аліаси для імен полів і таблиць; більш того, обов’язково потрібно використовувати аліаси при посиланні на властивості Java-бінів промаплених класів в умові where.

В запитах можна використовувати параметри, зокрема, іменовані параметри, що робить програмування зручнішим, а програму більш наглядною. Іменовані параметри починаються з двокрапки.

Приклад:

Query query=session.createQuery("from readtable.Person p where p.id=:id");

query.setInteger("id", 1);

data=query.list();

{Питання: Де ви раніше зустрічались з такого роду параметрами?}

Запис інформації з базу

package readtable;

import java.util.List;

import java.util.ListIterator;

import org.hibernate.Query;

import org.hibernate.Session;

import org.hibernate.SessionFactory;

import org.hibernate.Transaction;

import org.hibernate.cfg.Configuration;

public class Run {

 static Configuration config;

 static SessionFactory sf;

 static Session session;

 static List<Person> data;

 public static void main(String[] args){

 config=new Configuration();

 config.configure("/readtable/hibernate.cfg.xml");

 sf=config.buildSessionFactory();

 session=sf.openSession();

 Transaction tx = null;

 try{

      tx = session.beginTransaction();

               Person person = new Person();

         person.setId(6);

         person.setSurname("Павленок");

         person.setName("Юрій");

         person.setBirthYear(1989);

         session.save(person);

         tx.commit();

 }catch(Exception e){

      if (tx != null)

         tx.rollback();

         System.out.println(e.getMessage());

 }finally{

       session.flush();

       session.close();

           }

 session=sf.openSession();

 Query query=session.createQuery("from readtable.Person p");

 data=query.list();

 for (ListIterator<Person> iter=data.listIterator();iter.hasNext();){

  Person person=iter.next();

  System.out.println(person.getId()+" "+person.getSurname()+" "+person.getName()+" "+person.getBirthYear());

 }

    session.close();

    sf.close();

}

}

Об’єкти, що мапляться, такі, як person у вищезазначеному прикладі, по відношенню до hibernate можуть знаходитись у двох станах: transient і persistent. Transient-об’єкт не пов’язаний ні з якою сесією. Коли створюється новий Track-об’єкт, він transient; якщо не зробити його persistent, він зникне назовсім, якщо буде вилучений прибиральником сміття чи програма завершиться.

Щоб зробити об’єкт persistent, потрібно передати його як параметр методу save() об’єкту типу Session. При цьому при прибиранні сміття чи завершенні програми об’єкт зберігається в базі і існує там, поки не буде явно вилучений. Якщо до persistent-об’єкта застосувати метод delete() класу Session, то він перейде в transient стан і буде існувати в програмі, але вже не буде автоматично зберігатись.

Якщо змінювати властивості persistent-об’єкта, то всі зміни автоматично заносяться в базу – не потрібно знову робити save() після кожної зміни.

Важливим є статус persistent-об’єктів, які працювали з сеансом, що був закритий, як наприклад, вибрані з БД select-запитом. Як зазначалося вище, сеанс є відкритим недовго і повинен закінчитись, як тільки закінчилось вибирання даних. В цьому випадку вибрані об’єкти були persistent, поки існував сеанс, але після його закриття перестали бути такими. При цьому дана інформація реально присутня в базі, але нема активного зв’язку між інформацією бази і об’єктами програми. В подальшому можна змінити об’єкт, відкрити сеанс і зберегти об’єкт.

Вилучення інформації з бази

Отримавши вказівник на persistent-об’єкт, можна вилучити його з бази наступним чином:

session.delete (aPerson);.

Після виконання даної операції об’єкт стає transient.

Інший шлях вилучення – виконати HQL-команду Delete:

session.delete ("from readtable.Person");.

Колекції і зв’язки між таблицями БД

Hibernate дозволяє легко встановлювати зв’язки один-до-одного, один-до-багатьох, багато-до-багатьох між класами, що маплять таблиці БД.

PAGE  1


 

А также другие работы, которые могут Вас заинтересовать

76272. ЭКОЛОГИЧЕСКИЕ ФАКТОРЫ И ИХ ВЛИЯНИЕ НА ЗДОРОВЬЕ 51.72 KB
  Все процессы в биосфере взаимосвязаны. Человечество - лишь незначительная часть биосферы, а человек является лишь одним из видов органической жизни. Разум выделил человека из животного мира и дал ему огромное могущество.
76273. Фонетика в латинском языке 30.12 KB
  В классическом латинском языке ударение согласно свидетельствам античных грамматиков было музыкальным повышение тона на ударном гласном; место ударения практически полностью определялось фонологической структурой слова.
76274. Олимпийские игры 91.35 KB
  Приняли участие лучшие спортсмены северных стран Норвегии Финляндии Швеции. Во всех дисциплинах лыжного спорта победителями оказались спортсмены Норвегии. Непревзойденными в хоккее были спортсмены Канады имевшие огромное преимущество над соперниками.
76275. ИНФЕКЦИОННЫЙ ЭНДОКАРДИТ 34.82 KB
  Наряду с этим к значимым факторам риска ИЭ у детей и подростков относятся пролапс митрального клапана особенно с миксоматозным утолщением клапанных створок и митральной регургитацией длительно стоящие катетеры центральных вен и перенесенные операции на сердце.
76276. Ишемический инсульт 19.56 KB
  Прежде всего на МРТ не визуализируется типичный эффект потери сигнала от сосудов в зоне патологии. В течение первых 3 сут развития инфаркта мозга на МРТ с контрастированием примерно в 30 случаев может наблюдаться усиление сигнала от соседней твердой мозговой оболочки.
76277. Операционные системы 51.7 KB
  Специфика ОС проявляется и в том каким образом она реализует сетевые функции: распознавание и перенаправление в сеть запросов к удаленным ресурсам передача сообщений по сети выполнение удаленных запросов.
76278. Наружная и передняя яремные вены, их корни, притоки и анастомозы 107.04 KB
  Анастомоз с v. jugularis anterior противоположной стороны – arcus venosus juguli (иногда сливаются в v. mediana colli), межсистемный. Анастомозы дуги с vv. thyroideae inferiores и с подкожными венами передней грудной стенки. Входит в spatium interaponeuroticum suprasternale, поворачивает в recessus lateralis, соединяясь с v. jugularis externa или в v. jugularis interna. Реже впадает в v. subclavia или v. brachiocephalica.
76279. Непарная вена 43.26 KB
  zygos начинается в брюшной полости являясь непосредственным продолжением правой восходящей поясничной вены v. Последняя начинается из мелких вен области крестца и поясницы которые анастомозируют с венами наружного позвоночного сплетения и поясничными венами из системы нижней полой вены. Притоки непарной вены: 1. Верхние диафрагмальные вены vv.
76280. Внутренняя яремная вена 66.65 KB
  В области шеи внутренняя яремная вена является самым крупным стволом. Вена располагаетсяв составе сосудистонервного пучка шеи латеральнее общей сонной артерии и блуждающего нерва. В области шеи внутренняя яремная вена получает непостоянные внечерепные притоки.