Persistence.xml et OSGi (Equinox)
Je suis actuellement en train de tester à l'aide de OSGi. Je suis en cours d'exécution par le biais de cette Éclipse. Je veux avoir ma couche DAO dans le cadre d'un OSGi solution, mais mon premier écueil 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
J'ai essayé de mettre le persistence.xml fichier dans beaucoup d'endroits différents, en vain. Toutes les idées sur ce que je fais de mal?
Est-il un moyen de charger manuellement les persistence.xml?
La 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 à:
le texte d'alt http://www.freeimagehosting.net/uploads/7b7b7d2d30.jpg
Voici mon Manifeste.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 Hibernate et la Persistance des Bocaux.
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>
Choses que j'ai essayé dans le Manifeste du Classpath avec pas de 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
Vous devez vous connecter pour publier un commentaire.
Je ne suis pas à l'aide de persistence.xml mais hibernate.cfg.xml qui est similaire:
Dans mon Activateur j'obtiens le fichier via le bundle contexte:
Voici un exemple de code comment je le fais et aussi référence à ce fichier:>
Comme vous pouvez le voir en ligne qui obtient le fichier de config est:
Comme vous pouvez le voir mon hibernate.cfg.xml n'est PAS dans le répertoire META-INF. Il est juste dans le dossier racine dans /src/......
Espère que ça aide.
Christoph
Utilisation EclipseLink et oublier la mise en veille prolongée et d'autres implémentations, parce que :
Vous aurez à jouer avec le chargeur de classe trop...
Fil.currentThread().setContextClassLoader(...)
Vous serez tenté de définir le bundle-classpath de l'attribut et ajouter les dépendances à la main au lieu d'installer jar faisceaux.
Vous aurez fournisseur ne sont pas trouvés erreurs ou vous pourriez ne pas être en mesure de trouver persistence.xml
Tous les efforts ci-dessus peut ne pas fonctionner après de nombreuses tentatives.
Cependant, avec EclipseLink c'est une évidence, la mise en œuvre a été conçu pour fonctionner hors de la boîte dans un environnement OSGI et il n'y a pas de chargement de classe des maux de tête.
Si vous utilisez EclipseLink jpa OSGi, votre MANIFESTE.MF manque de JPA-PersistenceUnits entrée. Ajouter
JPA-PersistenceUnits: postgres
dans le MANIFESTE.MF.
BONNE CHANCE, en fait 2.3 a un problème dans le déploiement, ne gère pas les bundleresource://xxxx Url :(, 2.1.2 fonctionne très bien 😉
Vous avez besoin d'avoir le répertoire qui contient META-INF dans le classpath. Chaque répertoire est recherché pour META-INF et si elle est trouvée, alors persistence.xml est recherché.
Si vous mettez "META-INF" sur le chemin de la classe, puis vous auriez besoin d'un autre META-INF dans le répertoire.
Essayez d'utiliser Bundle-ClassPath comme ceci dans votre manifeste
Bundle-ClassPath: ., /location/of/persistence.xml
Le répertoire Meta-inf n'est pas sur le chemin de la classe. Cela devrait fonctionner simplement en la plaçant sous votre src répertoire. Si vous le souhaitez dans un autre emplacement, vous devez alors spécifier le Bundle-Classpath pour inclure ce répertoire. Par défaut, la classe est '.'.
J'obtiens le même problème.
Je pense que eclipse lien est la meilleure option pour les utiliser dans un Environnement OSGi. Et il n'y a pas de problème parce que vous allez travailler essentiellement avec l'implémentation JPA. Lorsque vous avez besoin de se déplacer à la mise en veille prolongée, il suffit de remplacer persintece.xml config et quelques libs.
vous devez définir la propriété (pour hibernate, il sera différent):
javax.la persistance.fournisseur=org.apache.openjpa.la persistance.PersistenceProviderImpl
pour appeler:
Persistance.createEntityManagerFactory(entityManagerFactoryName, propriétés)
pour le faire fonctionner.
Et, comme mentionné avant, vous avez besoin du chargeur de classe de l'emballage. Vous pouvez utiliser ClassloaderEntityManager de https://issues.apache.org/jira/browse/OPENJPA-1783 de le faire.
Ce qui concerne