Question

Je suis en train de tester à l'aide OSGi. Je suis En l'utilisant Eclipse. Je veux avoir ma couche DAO dans le cadre d'une solution de OSGi, mais mon premier bloc d'achoppement est cette erreur:

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

Je l'ai essayé de mettre le fichier persistence.xml dans beaucoup d'endroits différents, en vain. Toutes les idées sur ce que je fais mal?

Est-il possible de charger manuellement le persistence.xml?

activateur ressemble à ceci:

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

    }

}

Voici ce que ma structure de répertoire ressemble à:

texte alt http://www.freeimagehosting.net/uploads/7b7b7d2d30.jpg

Voici mon Manifest.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 contient tous les Jars Mise en veille prolongée et persistance.

Voici mon 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>

Ce que j'ai essayé dans Classpath du Manifest sans chance:

Bundle-Classpath:., META-INF / persistence.xml

Bundle-Classpath:., ../ META-INF / persistence.xml

Bundle-Classpath:., /META-INF/persistence.xml

Bundle-Classpath:., ./META-INF/persistence.xml

Bundle-Classpath:., META-INF

Bundle-Classpath:., ../ META-INF

Bundle-Classpath:., / META-INF

Bundle-Classpath:., ./META-INF

Bundle-ClassPath:., C: \ Workspaces \ OSGiJPA \ Dao \ META-INF \ persistence.xml

Bundle-ClassPath:., C: \ Workspaces \ OSGiJPA \ Dao \ META-INF

Était-ce utile?

La solution

Je n'utilise pas persistence.xml mais hibernate.cfg.xml qui est similaire:

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

Dans mon Activator Je reçois le fichier via le contexte du paquet: Voici quelques exemples de code comment je le fais et référence également ce fichier:>

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
        }
    }

Comme vous pouvez le voir la ligne qui obtient le fichier de configuration est la suivante:

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

Comme vous pouvez voir mon hibernate.cfg.xml est pas dans le dossier META-INF. Il est juste dans le dossier racine sous / src /......

L'espoir qui aide.

Christoph

Autres conseils

Utilisez EclipseLink et oublier Hibernate et d'autres implémentations, parce que:

  • Vous devez jouer avec le classloader trop ... Thread.currentThread (). SetContextClassLoader (...)

  • Vous serez tenté de définir l'attribut bundle-classpath et ajouter des dépendances manuellement au lieu d'installer des paquets de pot.

  • Vous obtiendrez fournisseur introuvable erreurs ou vous pourriez ne pas être en mesure de trouver persistence.xml

Tous ces efforts pourraient ne pas fonctionner après de nombreuses tentatives.

Cependant, avec EclipseLink il est une évidence, la mise en œuvre a été conçue pour fonctionner hors de la boîte dans un environnement OSGi et il n'y a pas de maux de tête de chargement de classe.

  1. (seulement une suggestion): mieux si vous utilisez un chargeur paresseux au lieu de faire le travail dans l'activateur. Par exemple, utilisez un singleton qui est invoquée dans SimpleDaoImpl contructor.
  2. Déplacer META-INF / persistent.xml sous le dossier src (src / META-INF / persistent.xml) parce que sous développement dossier META-INF est pas classpath, il fonctionne uniquement en mode d'exécution.
  3. Si vous utilisez EclipseLink JPA OSGi, votre MANIFEST.MF manque d'entrée JPA-PersistenceUnits. Ajouter

    JPA-PersistenceUnits: postgres

    dans le MANIFEST.MF.

  4. Ensuite, dans votre configuration de lancement de définir le niveau de début de org.eclipse.persistence.jpa.osgi (pour 2.3.x ecliselink autrement org.eclipse.persistence.jpa pour 2.1.x) à 2 et niveau de départ de javax.persistence à 1.

GOOD LUCK, en fait 2.3 a un problème dans le déploiement, ne gère pas bundleresource: // xxxx URL :(, 2.1.2 fonctionne très bien;)

Vous devez avoir le répertoire qui contient META-INF sur le chemin de classe. Chaque répertoire est recherché META-INF et si trouvé, persistence.xml est recherché.

Si vous mettez "META-INF" sur le chemin de classe, alors vous auriez besoin d'un autre META-INF dans ce répertoire.

Essayez d'utiliser Bundle-Classpath comme ceci dans votre manifeste

Bundle-Classpath:., /Location/of/persistence.xml

Le répertoire méta-inf est pas sur le chemin de classe. Cela devrait fonctionner en le plaçant simplement sous votre src dirctory. Si vous le souhaitez dans un autre endroit, alors vous devrez spécifier le Bundle-Classpath pour inclure ce répertoire. Par défaut, le chemin de classe est ''.

Je reçois le même problème.

Je pense que eclipselink est la meilleure option pour utiliser dans un environnement OSGi. Et il y a pas de problème parce que vous travaillerez essentiellement avec l'implémentation JPA. Lorsque vous avez besoin de passer à Hibernate, il suffit de remplacer config persintece.xml et quelques libs.

vous devez définir la propriété (pour mise en veille prolongée, il sera différent):

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

pour l'appel:

Persistence.createEntityManagerFactory (entityManagerFactoryName, propriétés)

pour le faire fonctionner.

Et comme mentionné précédemment, vous avez besoin d'emballage classloader. Vous pouvez utiliser ClassloaderEntityManager de https://issues.apache.org/jira/browse/OPENJPA -1783 pour le faire.

Cordialement

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top