Вопрос

В настоящее время я тестирую использование OSGi.Я запускаю это через Eclipse.Я хочу, чтобы мой уровень DAO был частью решения OSGi, но моим первым камнем преткновения является эта ошибка:

Jun 29, 2009 6:12:37 PM org.hibernate.cfg.annotations.Version <clinit>
INFO: Hibernate Annotations 3.3.0.GA
Jun 29, 2009 6:12:37 PM org.hibernate.ejb.Version <clinit>
INFO: Hibernate EntityManager 3.3.0.GA
Jun 29, 2009 6:12:37 PM org.hibernate.ejb.Ejb3Configuration configure
INFO: Could not find any META-INF/persistence.xml file in the classpath

Я пытался поместить файл persistence.xml во множество разных мест, но безрезультатно. Есть какие-нибудь идеи о том, что я делаю не так?

Есть ли способ вручную загрузить файл persistence.xml?

Тот Самый активатор выглядит примерно так:

package com.activator;


public class PersistenceActivator implements BundleActivator {

    @Override
    public void start(BundleContext arg0) throws Exception {

        EntityManagerFactory emf = Persistence
                .createEntityManagerFactory("postgres");
        EntityManager em = emf.createEntityManager();

        SimpleDaoImpl dao = new SimpleDaoImpl();
        dao.setEntityManager(em);

    }

    @Override
    public void stop(BundleContext arg0) throws Exception {
        // TODO Auto-generated method stub

    }

}

Вот как выглядит моя структура каталогов:

альтернативный текст http://www.freeimagehosting.net/uploads/7b7b7d2d30.jpg

Вот мой Манифест.MF

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: Dao Plug-in
Bundle-SymbolicName: Dao
Bundle-Version: 1.0.0
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Import-Package: org.osgi.framework;version="1.4.0"
Bundle-Activator: com.activator.PersistenceActivator
Export-Package: com.dao.service
Require-Bundle: HibernateBundle;bundle-version="1.0.0"

HibernateBundle Спящий режим содержит все банки Hibernate и Persistence.

Вот мой Persistence.xml

<?xml version="1.0" encoding="UTF-8"?>

<persistence>

    <!-- Sample persistence using PostgreSQL. See postgres.txt. -->
    <persistence-unit name="postgres" transaction-type="RESOURCE_LOCAL">

        <properties>


            <property name="hibernate.archive.autodetection" value="class" />

            <!--
                Comment out if schema exists & you don't want the tables dropped.
            -->
            <property name="hibernate.hbm2ddl.auto" value="create-drop" /> <!-- drop/create tables @startup, drop tables @shutdown -->


            <!-- Database Connection Settings -->
            <property name="hibernate.connection.autocommit">true</property>
            <property name="hibernate.connection.driver_class" value="org.postgresql.Driver" />
            <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" />
            <property name="hibernate.connection.username" value="postgres" />
            <property name="hibernate.connection.password" value="postgres" />
            <property name="hibernate.connection.url" value="jdbc:postgresql://localhost:5432/test" />

            <!-- Not sure about these...  -->
            <property name="hibernate.max_fetch_depth">16</property>
            <property name="hibernate.jdbc.batch_size">1000</property>
            <property name="hibernate.use_outer_join">true</property>
            <property name="hibernate.default_batch_fetch_size">500</property>

            <!-- Hibernate Query Language (HQL) parser. -->
            <property name="hibernate.query.factory_class">
                org.hibernate.hql.ast.ASTQueryTranslatorFactory</property>

            <!-- Echo all executed SQL to stdout -->
            <property name="hibernate.show_sql">true</property>
            <property name="hibernate.format_sql">false</property>

            <!-- Use c3p0 for the JDBC connection pool -->
            <property name="hibernate.c3p0.min_size">3</property>
            <property name="hibernate.c3p0.max_size">100</property>
            <property name="hibernate.c3p0.max_statements">100</property>

            <property name="hibernate.cache.provider_class" value="org.hibernate.cache.HashtableCacheProvider" />

        </properties>
    </persistence-unit>



</persistence>

То, что я пробовал в Пути к классам Манифеста, безуспешно:

Пакет-Путь к классу:., META-INF/persistence.xml

Пакет-Путь к классу:.,../META-INF/persistence.xml

Пакет-Путь к классу:., /META-INF/persistence.xml

Пакет-Путь к классу:., ./META-INF/persistence.xml

Пакет-Путь к классу:., META-INF

Пакет-Путь к классу:., ../META-INF

Пакет-Путь к классу:., /META-INF

Пакет-Путь к классу:., ./META-INF

Пакет-Путь к классу:., C:\Workspaces\OSGiJPA\Dao\META-INF\persistence.xml

Пакет-Путь к классу:., C:\Workspaces\OSGiJPA\Dao\META-INF

Это было полезно?

Решение

Я не использую persistence.xml но hibernate.cfg.xml что похоже:

src/main/resource/hibernate/hibernate.cfg.xml

В моем активаторе я получаю файл через контекст пакета:Вот несколько примеров кода, как я это делаю, а также ссылка на этот файл:>

private void initHibernate(BundleContext context) {
        try {
            final AnnotationConfiguration cfg = new AnnotationConfiguration();
            cfg.configure(context.getBundle().getEntry("/src/main/resource/hibernate/hibernate.cfg.xml"));
            sessionFactory = cfg.buildSessionFactory();

        } catch (Exception e) {
            // TODO Auto-generated catch block
        }
    }

Как вы можете видеть, строка, которая возвращает конфигурационный файл, является:

context.getBundle().getEntry("/src/main/resource/hibernate/hibernate.cfg.xml")

Как вы можете видеть, my hibernate.cfg.xml не находится внутри папки META-INF.Он находится просто в корневой папке под /src/......

Надеюсь, это поможет.

Кристоф

Другие советы

Использование Ссылка на затмение и забудьте о гибернации и других реализациях, потому что :

  • Вам придется слишком много играть с загрузчиком классов...Thread.currentThread().setContextClassLoader(...)

  • У вас возникнет соблазн установить атрибут bundle-classpath и добавить зависимости вручную вместо установки пакетов jar.

  • Ты получишь провайдер не найден ошибки, или вы, возможно, не сможете найти persistence.xml

Все вышеперечисленные усилия могут не сработать после многих попыток.

Однако с EclipseLink это несложно, реализация была разработана для работы "из коробки" в среде OSGI, и никаких проблем с загрузкой классов не возникает.

  1. (всего лишь предложение):Лучше, если вы используете ленивый загрузчик вместо того, чтобы выполнять эту работу в активаторе.Например, используйте синглтон, который вызывается в конструкторе SimpleDaoImpl.
  2. Переместить META-INF/persistent.xml в папку src (src/META-INF/persistent.xml) поскольку в папке develop META-INF папки нет в classpath, она работает только в режиме выполнения.
  3. Если вы используете EclipseLink jpa OSGi, в вашем файле MANIFEST.MF отсутствует запись JPA-PersistenceUnits.Добавить

    JPA-Единицы сохранения:postgres

    в МАНИФЕСТ.МФ.

  4. Затем в вашей конфигурации запуска установите начальный уровень org.eclipse.persistence.jpa.osgi (для ecliselink 2.3.x в противном случае org.eclipse.persistence.jpa для 2.1.x) равным 2, а начальный уровень javax.persistence - 1.

УДАЧИ, на самом деле 2.3 имеет проблему при развертывании, не обрабатывает URLS bundleresource: //xxxx :(, 2.1.2 работает очень хорошо ;)

У вас должен быть каталог, содержащий META-INF, в пути к классу.В каждом каталоге выполняется поиск META-INF, и если он найден, то выполняется поиск persistence.xml.

Если вы добавите "META-INF" в путь к классу, то вам понадобится другой META-INF в этом каталоге.

Попробуйте использовать Bundle-ClassPath, подобный этому, в своем манифесте

Пакет-Путь к классу:., /location/of/persistence.xml

Каталог Meta-inf отсутствует в пути к классу.Это должно сработать, если просто поместить его под вашим Src дирктори.Если вы хотите, чтобы он находился в отдельном расположении, то вам нужно будет указать путь к классу пакета, чтобы включить этот каталог.По умолчанию путь к классу равен '.'.

У меня та же проблема.

Я думаю, что eclipse link - лучший вариант для использования в среде OSGi.И здесь нет никаких проблем, потому что вы будете работать в основном с реализацией JPA.Когда вам нужно перейти в режим гибернации, просто замените persintece.xml config и некоторые библиотеки.

вам нужно установить свойство (для гибернации оно будет другим).:

javax.persistence.provider=org.apache.openjpa.persistence.PersistenceProviderImpl

для вызова:

Сохранение.createEntityManagerFactory(entityManagerFactoryName, свойства)

чтобы заставить это сработать.

И, как упоминалось ранее, вам нужна упаковка classloader.Вы можете использовать ClassloaderEntityManager из https://issues.apache.org/jira/browse/OPENJPA-1783 чтобы сделать это.

С уважением

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top