Большинство из вас знают , что я работаю в качестве коммиттеру для различных Eclipse , связанных проектов (таких как XText , Xpand и моделирования рабочего процесса двигателя ). Вы, возможно, не знаете, однако, что я также работаю консультантом для itemis . На одном из моих недавних консультационных заданий в Оттаве, Канада, меня спросили: «Как мы можем использовать EMF для хранения наших данных в базе данных?»
Что ж, получается, что EMF может помочь долго хранить данные в базе данных. Вот как.
Подготовьте вашу среду разработки
- Получить Eclipse 3.5 M5 ( нажмите здесь, чтобы загрузить )
- Распакуйте и запустите Eclipse
- Откройте диалоговое окно «Установка нового программного обеспечения» (Справка -> Установить новое программное обеспечение)
- Выберите Teneo EMF Hibernate Runtime и Teneo EMF Hibernate SDK , версия 1.0.3
- Cick Finish
- Скорее всего, вам будет предложено перезапустить Eclipse.
Создайте определение цели, которое включает Hibernate и HSQLDB
Для простоты мы будем хранить данные в базе данных HSQLDB . Мы будем использовать Hibernate OR Mapper для выполнения сопоставления между вашими объектами данных и базой данных. Как вы можете догадаться, для выполнения задачи будет задействовано множество библиотек. Вместо того, чтобы создавать кучу подключаемых проектов, содержащих соответствующие библиотеки, или, что еще хуже, копировать все библиотеки в наш проект, мы установим определение цели. Определения целей помогают поддерживать общий набор зависимостей для всех разработчиков в команде, что является хорошей идеей.
- Создайте новый проект library.target (Файл -> Новый -> Проект … -> Общие -> Проект)
- Создайте в этом проекте три папки: hibernate , зависимости , hsqldb
- Перейдите в репозиторий SpringSource Bundle и загрузите следующие пакеты OSGi:
файл сохранить в папке com.springsource.org.hibernate-3.2.6.ga.jar library.target/hibernate com.springsource.org.apache.commons.logging-1.1.1.jar library.target/dependencies com.springsource.org.dom4j-1.6.1.jar library.target/dependencies com.springsource.org.apache.commons.collections-3.2.0.jar library.target/dependencies com.springsource.javax.transaction-1.1.0.jar library.target/dependencies com.springsource.antlr-2.7.7.jar library.target/dependencies com.springsource.org.hsqldb-1.8.0.9.jar library.target/hsqldb - Создайте новое определение цели library.target в этом проекте (Файл -> Создать -> Другие … -> Разработка плагинов -> Определение цели)
- Откройте определение цели и добавьте три каталога к его содержимому. Поскольку GUI не позволяет вам работать с относительными путями, вы можете использовать текстовый редактор для вставки следующего текста:
<?xml version="1.0" encoding="UTF-8"?> <?pde version="3.5"?> <target description="Teneo-related stuff, mostly Hibernate" name="Library Target Definition"> <locations> <location path="${eclipse_home}" type="Profile"/> <location path="${workspace_loc}/library.target/hibernate" type="Directory"/> <location path="${workspace_loc}/library.target/dependencies" type="Directory"/> <location path="${workspace_loc}/library.target/hsqldb" type="Directory"/> </locations> </target>
- Откройте определение цели в Редакторе определения цели и щелкните гиперссылку Установить как целевую платформу в правой верхней области. Это активирует определение цели. Все содержащиеся в пакете теперь доступны и могут быть указаны как зависимости.
Создайте модель для ваших данных
Модель данных будет основана на известном учебном пособии по библиотеке, которое поставляется с EMF. Если вы заинтересованы в более глубоком взгляде, я рекомендую взять этот учебник. Однако, для краткости, вот ультратонкая версия EMF-Tutorial:
- Загрузите модель класса Rose и сохраните ее на своем компьютере
- Создайте новый проект EMF (Файл -> Создать -> Другое … -> Eclipse Modeling Framework -> Проект EMF)
- Название проекта: библиотека
- Импортер модели: модель класса Роуз
- Найдите модель библиотеки Rose.mdl, упомянутую ранее
- Нажмите на Загрузить, чтобы загрузить модель
- Нажмите Далее, затем Готово
- В редакторе library.genmodel щелкните правой кнопкой мыши узел «Библиотека» и выберите «Создать код модели».
Создать главное приложение библиотеки
Чтобы продемонстрировать, как использовать модель данных и выполнять операции CRUD с вашими данными, мы создадим простой класс Java. В духе инкапсуляции и компонентов мы создадим новый проект плагина для размещения этого класса:
- Создайте новый проект библиотеки plug-in.main (Файл -> Создать -> Проект … -> Проект плагина)
- Откройте манифест и добавьте следующие зависимости:
- библиотека (это пакет, который содержит нашу модель данных)
- org.eclipse.emf.teneo.hibernate
- org.eclipse.emf.ecore.xmi
- com.springsource.org.hibernate
- com.springsource.org.apache.commons.logging
- com.springsource.org.dom4j
- com.springsource.org.apache.commons.collections
- com.springsource.javax.transaction
- com.springsource.antlr
- com.springsource.org.hsqldb
- Создайте новый файл конфигурации Hibernate hibernate.properties в library.main / src и вставьте следующие строки:
hibernate.connection.driver_class=org.hsqldb.jdbcDriver # use the following line to run the embedded db: # hibernate.connection.url=jdbc:hsqldb:file:/some/path/on/your/computer/dbname # the following line will connect to a standalone (local) DB server: hibernate.connection.url=jdbc:hsqldb:hsql://127.0.0.1/library hibernate.connection.username=sa hibernate.connection.password= hibernate.dialect=org.hibernate.dialect.HSQLDialect hibernate.hbm2ddl.auto=true
Реализовать основное приложение библиотеки
Со всеми шаблонами на месте, мы наконец готовы написать некоторый код. Мы создадим новый класс и добавим немного кода, чтобы создать автора и его книгу и сохранить их в библиотеке.
- Создайте новый класс LibraryDemo, убедившись, что у него есть метод main
- Чтобы использовать Teneo для сохранения наших данных, нам сначала нужно создать хранилище данных и зарегистрировать в нем наш пакет моделей:
// create the data store String dataStoreName = "LibraryDataStore"; HbDataStore dataStore = HbHelper.INSTANCE.createRegisterDataStore(dataStoreName); // register the model package with the data store dataStore.setEPackages(new EPackage[] { LibraryPackage.eINSTANCE }); // initialize the data store, which creates the tables dataStore.initialize();
- Далее нам нужно завладеть фабрикой сессий и запросить новую сессию из нее:
SessionFactory sessionFactory = dataStore.getSessionFactory(); { Session session = sessionFactory.openSession(); session.beginTransaction();
- Теперь давайте создадим новую библиотеку и сохраним ее в сессии:
// create a library Library library = LibraryFactory.eINSTANCE.createLibrary(); library.setName("Developer's bookshelf"); // store the library session.save(library);
- В следующей части мы создадим автора и его книгу, свяжем их друг с другом и добавим в библиотеку. В этой части кода нет конкретного аспекта Teneo, это просто прямое использование API EMF, сгенерированного для вашей модели данных:
// create an author Writer writer = LibraryFactory.eINSTANCE.createWriter(); writer.setName("A. K. Dewdney"); // create a book Book book = LibraryFactory.eINSTANCE.createBook(); book.setTitle("The New Turing Omnibus"); book.setPages(480); book.setCategory(BookCategory.MYSTERY); // oh well, let's hope it's not mystery to most readers! book.setAuthor(writer); // add book and writer to library library.getBooks().add(book); library.getWriters().add(writer);
- Наконец, нам нужно зафиксировать наши изменения в базе данных и закрыть сеанс:
// commit changes to the database and close the session session.getTransaction().commit(); session.close(); }
Запустите сервер БД и запустите приложение
- Откройте командную строку и перейдите в каталог, содержащий hsqldb.jar
- Запустите сервер HSQLDB с помощью этой командной строки:
java -cp com.springsource.org.hsqldb-1.8.0.9.jar org.hsqldb.Server -database.0 file:library -dbname.0 library
- Наконец (!) Вернитесь в Eclipse и запустите LibraryDemo . Вы должны получить вывод, похожий на этот:
Mar 6, 2009 1:50:26 PM org.eclipse.emf.teneo.hibernate.HbHelper createRegisterDataStore INFO: Creating emf data store and registering it under name: LibraryDataStore ... Mar 6, 2009 1:50:28 PM org.hibernate.tool.hbm2ddl.SchemaUpdate execute INFO: schema update complete
- Чтобы реально увидеть данные, хранящиеся в базе данных, перейдите в каталог, содержащий базу данных, и откройте library.log :
CREATE USER SA PASSWORD "" ADMIN /*C1*/SET SCHEMA PUBLIC CONNECT USER SA ... INSERT INTO "library" VALUES(1,'Library',0,'Developer''s bookshelf') INSERT INTO "writer" VALUES(1,'Writer',0,'A. K. Dewdney',NULL,NULL,'Library','1',-2) INSERT INTO "book" VALUES(1,'Book',0,'The New Turing Omnibus',480,'Mystery',1,NULL,NULL,'Library','1',-3) DELETE FROM "writer" WHERE E_ID=1 INSERT INTO "writer" VALUES(1,'Writer',0,'A. K. Dewdney',1,0,'Library','1',-2) DELETE FROM "book" WHERE E_ID=1 INSERT INTO "book" VALUES(1,'Book',0,'The New Turing Omnibus',480,'Mystery',1,1,0,'Library','1',-3) INSERT INTO "writer_books" VALUES(1,1,0) COMMIT DISCONNECT
В следующей части я покажу вам, как извлекать объекты из базы данных и запрашивать базу данных, используя Hibernate Query Language (HQL).