Pregunta

Actualmente estoy probando a cabo utilizando OSGi. Estoy funcionando esto a través de Eclipse. Quiero tener mi capa DAO como parte de una solución de OSGi, pero mi primer escollo es este error:

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

He intentado poner el archivo persistence.xml en un montón de lugares diferentes, pero en vano. ¿Alguna idea de lo que estoy haciendo mal?

¿Hay una manera de cargar manualmente el persistence.xml?

La activador es el siguiente:

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

    }

}

Esto es lo que mi estructura de directorios se ve así:

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

Aquí está mi Manifest.MF de

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 contiene toda la hibernación y la persistencia tarros.

Aquí está mi 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>

Las cosas que he probado en rutas de clases del Manifiesto sin suerte:

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: \ espacios de trabajo \ OSGiJPA \ Dao \ META-INF \ persistence.xml

Bundle-ClassPath:., C: \ espacios de trabajo \ OSGiJPA \ Dao \ META-INF

¿Fue útil?

Solución

No estoy usando persistence.xml pero hibernate.cfg.xml que es similar:

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

En mi Activador estoy recibiendo el archivo a través del contexto paquete: Aquí es un código de ejemplo de cómo lo hago y también hacen referencia a ese archivo:>

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

Como se puede ver la línea que recibe el archivo de configuración es la siguiente:

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

Como se puede ver mi hibernate.cfg.xml no está dentro de la carpeta META-INF. Es sólo en la carpeta raíz en / src /......

Espero que ayude.

Christoph

Otros consejos

EclipseLink y olvidarse de Hibernate y otras implementaciones, ya que:

  • Vas a tener que jugar con el cargador de clases demasiado ... Thread.currentThread (). SetContextClassLoader (...)

  • tendrá la tentación de establecer el atributo de paquete-ruta de clase y agregar dependencias manualmente en lugar de instalación de paquetes de tarro.

  • Usted obtendrá proveedor no encontrados errores o puede que no sea capaz de encontrar persistence.xml

Todos los esfuerzos anteriores no funcionen después de muchos intentos.

Sin embargo, con EclipseLink es una obviedad, la aplicación fue diseñada para trabajar fuera de la caja en un entorno OSGi y no hay ningún dolores de cabeza de carga de clases.

  1. (sólo una sugerencia): mejor si se utiliza un cargador lento en lugar de hacer el trabajo en el activador. Por ejemplo utilizar un producto único que se invoca en SimpleDaoImpl contructor.
  2. Mover META-INF / persistent.xml en la carpeta src (src / META-INF / persistent.xml) porque bajo el desarrollo de la carpeta META-INF no está en la ruta de clases, sólo funciona en el modo de tiempo de ejecución.
  3. Si está utilizando EclipseLink JPA OSGi, su MANIFIEST.MF falta de entrada de la APP-PersistenceUnits. Añadir

    JPA-PersistenceUnits: postgres

    en el MANIFIEST.MF.

  4. A continuación, en su configuración de lanzamiento establecer el nivel de inicio de org.eclipse.persistence.jpa.osgi (por 2.3.x ecliselink lo contrario org.eclipse.persistence.jpa para 2.1.x) a 2 y empezar a nivel de javax.persistence a 1.

Buena suerte, en realidad 2.3 tiene un problema en la implementación, no maneja bundleresource: // xxxx URL :(, 2.1.2 funciona muy bien;)

Es necesario tener el directorio que contiene META-INF en la ruta de clase. Cada directorio se busca META-INF y si lo encuentra, entonces persistence.xml se busca.

Si pones "META-INF" en la ruta de clase, entonces se necesitaría otra META-INF en ese directorio.

Trate de usar Bundle-ClassPath como este en su manifiesto

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

El directorio META-INF no está en la ruta de clase. Esto debería funcionar con sólo colocar debajo de su dirctory src. Si usted quiere que en un lugar separado, a continuación, tendrá que especificar el Bundle-Classpath para incluir ese directorio. Por defecto, la ruta de clase es ''.

Me estoy poniendo el mismo problema.

Creo enlace eclipse es la mejor opción para usar en un entorno OSGi. Y no hay problema porque se va a trabajar básicamente con la implementación de la APP. Cuando tenga que mover a Hibernate, basta con sustituir config persintece.xml y algunas librerías.

tiene que establecer la propiedad (para hibernar será diferente):

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

de llamada:

Persistence.createEntityManagerFactory (entityManagerFactoryName, propiedades)

para hacer que funcione.

Y como se mencionó antes, es necesario envolver cargador de clases. Puede utilizar ClassloaderEntityManager de https://issues.apache.org/jira/browse/OPENJPA -1783 de hacer eso.

Regards

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top