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


 

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

81557. Свертывающая система крови. Этапы образования фибринового сгустка. Внутренний и внешний пути свертывания и их компоненты 234.47 KB
  При повреждении кровеносного сосуда инициируется каскад реакций, в результате которого образуется сгусток крови - тромб, предотвращающий кровотечение. Основную роль в свёртывании (коагуляции) крови играют тромбоциты и ряд белков плазмы крови. В остановке кровотечения различают 3 этапа. На первом этапе происходит сокращение кровеносного сосуда
81558. Принципы образования и последовательность фукционирования ферментных комплексов прокоагулянтного пути. Роль витамина К в свертывании крови 107.4 KB
  В циркулирующей крови содержатся проферменты протеолитических ферментов: фактор II протромбин фактор VII проконвертин фактор IX Кристмаса фактор X Стюарта. Находящиеся в крови факторы V акцелерин и VIII антигемофильный фактор а также мембранный белок тканевый фактор ТФ фактор III являются белкамиактиваторами этих ферментов. Комплекс XVСа2 протромбиназный комплекс активирует протромбин фактор II. В процессе реализации тромбогенного сигнала проферменты факторы VII IX X и II частичным протеолизом превращаются в...
81559. Основные механизмы фибринолиза. Активаторы плазминогена как тромболитические средства. Основаные антикоагулянты крови: антитромбин III, макроглобулин, антиконвертин. Гемофилии 154.37 KB
  Основаные антикоагулянты крови: антитромбин III макроглобулин антиконвертин. Такие ингибиторы ферментов свёртывания крови как α2макроглобулин α1антитрипсин и комплекс антитромбин IIIгепарин также обладают небольшой фибринолитической активностью. Снижение фибринолитической активности крови сопровождается тромбозами. Нарушение разрушения фибринового сгустка может быть вызвано наследственным дефицитом плазминогена или генетическим дефектом его структуры снижением поступления в кровь активаторов плазминогена повышением содержания в крови...
81560. Клиническое значение биохимического анализа крови 101.37 KB
  Среди медицинских анализов особенное значение имеет анализ крови связующего звена между всеми системами и органами тела. Распространенным лабораторным методом изучения ее состава является биохимический анализ крови. В связи со своей универсальностью биохимический анализ крови назначается врачами разных медицинских специальностей терапевтами кардиологами гастроэнтерологами ревматологами и другими.
81561. Основные мембраны клетки и их функции. Общие свойства мембран: жидкостность, поперечная асимметрия, избирательная проницаемость 106.22 KB
  Все клетки имеют мембраны. Мембраны ответственны за выполнение многих важнейших функций клетки. К основным функциям мембран можно отнести: отделение клетки от окружающей среды и формирование внутриклеточных компартментовотсеков; контроль и регулирование транспорта огромного разнообразия веществ через мембраны; участие в обеспечении межклеточных взаимодействий передаче внутрь клетки сигналов; преобразование энергии пищевых органических веществ в энергию химических связей молекул АТФ.
81562. Липидный состав мембран (фосфолипиды, гликолипиды, холестерин). Роль липидов в формировании липидного бислоя 104.87 KB
  В мембранах присутствуют липиды трёх главных типов фосфолипиды гликолипиды и холестерол холестерин. Липидный состав мембран различен содержание того или другого липида повидимому определяется разнообразием функций выполняемых этими липидами в мембранах. В мембранах эукариотических клеток обнаружено огромное количество разных фосфолипидов причём они распределены неравномерно по разным клеточным мембранам. В плазматических мембранах клеток в значительных количествах содержатся сфингомиелины.
81563. Белки мембран - интегральные, поверхностные, «заякоренные». Значение посттрансляционных модификаций в образовании функциональных мембранных белков 104.74 KB
  Мембранные белки контактирующие с гидрофобной частью липидного бислоя должны быть амфифильными. Белки мембран различаются по своему положению в мембране. Они могут глубоко проникать в липидный бислой или даже пронизывать его интегральные белки либо разными способами прикрепляться к мембране поверхностные белки. Поверхностные белки.
81564. Механизмы переноса веществ через мембраны: простая диффузия, первично-активный транспорт (Nа+-К+-АТФаза, Са2+-АТФаза), пассивный симпорт и антипорт, вторично-активный транспорт 106.69 KB
  Перенос некоторых неорганических ионов идёт против градиента концентрации при участии транспортных АТФаз ионных насосов. АТФазы различаются по ионной специфичности количеству переносимых ионов направлению транспорта. В результате функционирования АТФазы переносимые ионы накапливаются с одной стороны мембраны.
81565. Трансмембранная передача сигнала. Участие мембран в активации внутриклеточных регуляторных систем - аденилатциклазной и инозитолфосфатной в передаче гормонального сигнала 109.02 KB
  Важное свойство мембран - способность воспринимать и передавать внутрь клетки сигналы из внешней среды. \"Узнавание\" сигнальных молекул осуществляется с помощью белков-рецепторов, встроенных в клеточную мембрану клеток-мишеней или находящихся в клетке. Клетку-мишень определяют по способности избирательно связывать данную сигнальную молекулу