Object Relational Mapping (ORM) Объектно-реляционное отображение
Взаимодействие между типами баз данных и подходами доступа к данным
Примеры реляционной и объектной модели Реляционная модельОбъектная модель предметной области CATALOG_ITEM отображается на иерархию классов в зависимости от значения дискриминатора ITEM_TYPE
Отображение таблицы CATALOG и класса Catalog.java Класс Catalog связан с таблицей CATALOG Первичный ключ – ID, связан со свойством id (функции getId()/setId()) Для генерации значений первичного ключа ID используется sequence SEQ_ID Атрибут NAME связан со свойством name (функции getName()/setName()) Объекты Catalog содержат список CatalogItem связь один-ко-многим обязательная (nullable=false) Внешний ключ, определяющий связь – CATALOG_ID Список CatalogItem загружаются по-требованию (FetchType.LAZY) При сохранении объекта Catalog автоматически сохраняются все его items (CascadeType.ALL)
Работа с Hibernate API Работая с данными в объектно-ориентированном языке, мы работаем с объектами, заполняя и считывая значения полей, создавая новые или изменяя существующие объекты, определяя зависимости между объектами При операции save() мы передаем объект типа Catalog, который сохраняется в базу данных по описанным правилам отображения. В том числе сохраняются и все зависимые объекты (CatalogItem) Составляя запросы к базе данных, мы уже указываем не столбцы таблицы, а свойства объектов
Протокол команд SQL Oracle Hibernate: select SEQ_ID.nextval from dual Hibernate: insert into CATALOG (NAME, ID) values (?, ?) Hibernate: insert into AUTHOR (NAME, BIRTHDATE, id) values (?, ?, ?) Hibernate: insert into CATALOG_ITEM (NAME, AUTHOR_ID, CATALOG_ID, ISBN, ITEM_TYPE, id) values (?, ?, ?, ?, 'BOOK', ?) Hibernate: insert into AUTHOR (NAME, BIRTHDATE, id) values (?, ?, ?) Hibernate: insert into CATALOG_ITEM (NAME, AUTHOR_ID, CATALOG_ID, GENRE, ITEM_TYPE, id) values (?, ?, ?, ?, 'MOVIE', ?) Hibernate: update CATALOG_ITEM set CATALOG_ID=? where id=? Hibernate: select catalog0_.ID as ID0_, catalog0_.NAME as NAME0_ from CATALOG catalog0_ SQL Server Hibernate: insert into CATALOG (NAME) values (?) Hibernate: insert into AUTHOR (NAME, BIRTHDATE) values (?, ?) Hibernate: insert into CATALOG_ITEM (NAME, AUTHOR_ID, CATALOG_ID, ISBN, ITEM_TYPE) values (?, ?, ?, ?, 'BOOK') Hibernate: insert into AUTHOR (NAME, BIRTHDATE) values (?, ?) Hibernate: insert into CATALOG_ITEM (NAME, AUTHOR_ID, CATALOG_ID, GENRE, ITEM_TYPE) values (?, ?, ?, ?, 'MOVIE') Hibernate: update CATALOG_ITEM set CATALOG_ID=? where id=? Hibernate: select catalog0_.ID as ID0_, catalog0_.NAME as NAME0_ from CATALOG catalog0_
Возможности ORM Загрузка связанных объектов по требованию (lazy loading) Обеспечение пессимистической/оптимистической блокировок Кэширование загруженных объектов SQL-подобные запросы по объектной модели
Преимущества ORM Нет необходимости писать рутинные insert/update/delete/select для CRUD операций Условия связи между объектами (строками таблиц) указываются декларативно в одном месте. Возможность использовать полиморфные запросы для иерархий классов Высокая степень независимости от конкретной СУБД
Недостатки ORM Возможны проблемы с производительностью для сложных запросов на объектном SQL. Затрудняет использование специфических конструкций языка SQL конкретной СУБД.
Реализации ORM Hibernate/NHibernate (Java /.NET 1.1,2.0) Oracle® TopLink® (Java) iBatis framework (Java,.NET) JPOX Java Data Objects (Java) …
Стандарты ORM EJB 1.1 Entity Beans Java Data Object (JDO) JPOX OpenAccess JDO EJB 3.0 Persistence API Hibernate Oracle TopLink
Литература и ссылки Мартин Фаулер Архитектура корпоративных программных приложений. М., Вильямс, relational_mapping relational_mapping rence/ru/html_single/ rence/ru/html_single/