Object Relational Mapping (ORM) Объектно-реляционное отображение
Взаимодействие между типами баз данных и подходами доступа к данным.NET: DataSet/DataTable Java: JDBC RowSet.NET: DataSet/DataTable Java: JDBC RowSet.NET: ADO.NET Command Java: JDBC Statement.NET: ADO.NET Command Java: JDBC Statement.NET: LINQ to SQL, NHibernate Java: JPA, Hibernate, JDO.NET: LINQ to SQL, NHibernate Java: JPA, Hibernate, JDO
Примеры реляционной и объектной модели Реляционная модельОбъектная модель предметной области 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 конкретной СУБД. The object-relational impedance mismatch
Реализации ORM Hibernate/NHibernate (Java /.NET ) ADO.NET Entity Framework (.NET 3.5) Oracle® TopLink® (Java) iBatis framework (Java,.NET) JPOX Java Data Objects (Java) …
Стандарты ORM EJB 1.1 Entity Beans (legacy) Устаревший стандарт, используется только в legacy приложениях Java Data Object (JDO) Редко используемый стандарт Реализации: JPOX, OpenAccess JDO Java Persistence API (JPA) Наиболее популярный Составная часть стандартов EJB 3+ и JEE 5 Реализации: Hibernate, Oracle TopLink, KODO (OpenJPA)
Литература и ссылки Общая литература: Мартин Фаулер Архитектура корпоративных программных приложений. М., Вильямс, Hibernate: Быстрый старт: Справочник: US/html_single/ US/html_single/ Java Persistence with Hibernate / Christian Bauer, Gavin King / Manning, 2006 NHibernate in Action / Pierre Henri Kuaté, Tobin Harris, Christian Bauer, and Gavin King / Manning 2009