Статьи

Использование Teneo и EMF для хранения ваших данных

Большинство из вас знают , что я работаю в качестве коммиттеру для различных Eclipse , связанных проектов (таких как XText , Xpand и моделирования рабочего процесса двигателя ). Вы, возможно, не знаете, однако, что я также работаю консультантом для itemis . На одном из моих недавних консультационных заданий в Оттаве, Канада, меня спросили: «Как мы можем использовать EMF для хранения наших данных в базе данных?»

Что ж, получается, что EMF может помочь долго хранить данные в базе данных. Вот как.

Подготовьте вашу среду разработки

  1. Получить Eclipse 3.5 M5 ( нажмите здесь, чтобы загрузить )
  2. Распакуйте и запустите Eclipse
  3. Откройте диалоговое окно «Установка нового программного обеспечения» (Справка -> Установить новое программное обеспечение)
  4. Выберите Teneo EMF Hibernate Runtime и Teneo EMF Hibernate SDK , версия 1.0.3
  5. Cick Finish
  6. Скорее всего, вам будет предложено перезапустить Eclipse.

Создайте определение цели, которое включает Hibernate и HSQLDB

Для простоты мы будем хранить данные в базе данных HSQLDB . Мы будем использовать Hibernate OR Mapper для выполнения сопоставления между вашими объектами данных и базой данных. Как вы можете догадаться, для выполнения задачи будет задействовано множество библиотек. Вместо того, чтобы создавать кучу подключаемых проектов, содержащих соответствующие библиотеки, или, что еще хуже, копировать все библиотеки в наш проект, мы установим определение цели. Определения целей помогают поддерживать общий набор зависимостей для всех разработчиков в команде, что является хорошей идеей.

  1. Создайте новый проект library.target (Файл -> Новый -> Проект … -> Общие -> Проект)
  2. Создайте в этом проекте три папки: hibernate , зависимости , hsqldb
  3. Перейдите в репозиторий 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
  4. Создайте новое определение цели library.target в этом проекте (Файл -> Создать -> Другие … -> Разработка плагинов -> Определение цели)
  5. Откройте определение цели и добавьте три каталога к его содержимому. Поскольку 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>
  6. Откройте определение цели в Редакторе определения цели и щелкните гиперссылку Установить как целевую платформу в правой верхней области. Это активирует определение цели. Все содержащиеся в пакете теперь доступны и могут быть указаны как зависимости.

Создайте модель для ваших данных

Модель данных будет основана на известном учебном пособии по библиотеке, которое поставляется с EMF. Если вы заинтересованы в более глубоком взгляде, я рекомендую взять этот учебник. Однако, для краткости, вот ультратонкая версия EMF-Tutorial:

  1. Загрузите модель класса Rose и сохраните ее на своем компьютере
  2. Создайте новый проект EMF (Файл -> Создать -> Другое … -> Eclipse Modeling Framework -> Проект EMF)

    • Название проекта: библиотека
    • Импортер модели: модель класса Роуз
    • Найдите модель библиотеки Rose.mdl, упомянутую ранее
    • Нажмите на Загрузить, чтобы загрузить модель
    • Нажмите Далее, затем Готово
  3. В редакторе library.genmodel щелкните правой кнопкой мыши узел «Библиотека» и выберите «Создать код модели».

Создать главное приложение библиотеки

Чтобы продемонстрировать, как использовать модель данных и выполнять операции CRUD с вашими данными, мы создадим простой класс Java. В духе инкапсуляции и компонентов мы создадим новый проект плагина для размещения этого класса:

  1. Создайте новый проект библиотеки plug-in.main (Файл -> Создать -> Проект … -> Проект плагина)
  2. Откройте манифест и добавьте следующие зависимости:

    • библиотека (это пакет, который содержит нашу модель данных)
    • 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
  3. Создайте новый файл конфигурации 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

Реализовать основное приложение библиотеки

Со всеми шаблонами на месте, мы наконец готовы написать некоторый код. Мы создадим новый класс и добавим немного кода, чтобы создать автора и его книгу и сохранить их в библиотеке.

  1. Создайте новый класс LibraryDemo, убедившись, что у него есть метод main
  2. Чтобы использовать 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();
  3. Далее нам нужно завладеть фабрикой сессий и запросить новую сессию из нее:
        SessionFactory sessionFactory = dataStore.getSessionFactory();
        {
            Session session = sessionFactory.openSession();
            session.beginTransaction();
  4. Теперь давайте создадим новую библиотеку и сохраним ее в сессии:
            // create a library
            Library library = LibraryFactory.eINSTANCE.createLibrary();
            library.setName("Developer's bookshelf");
    
            // store the library
            session.save(library);
  5. В следующей части мы создадим автора и его книгу, свяжем их друг с другом и добавим в библиотеку. В этой части кода нет конкретного аспекта 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);
  6. Наконец, нам нужно зафиксировать наши изменения в базе данных и закрыть сеанс:
            // commit changes to the database and close the session
            session.getTransaction().commit();
            session.close();
        }

Запустите сервер БД и запустите приложение

  1. Откройте командную строку и перейдите в каталог, содержащий hsqldb.jar
  2. Запустите сервер HSQLDB с помощью этой командной строки:
    java -cp com.springsource.org.hsqldb-1.8.0.9.jar org.hsqldb.Server -database.0 file:library -dbname.0 library
  3. Наконец (!) Вернитесь в 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
  4. Чтобы реально увидеть данные, хранящиеся в базе данных, перейдите в каталог, содержащий базу данных, и откройте 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).

С http://www.peterfriese.de/