6

我目前正在使用 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 Jars。

这是我的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>

我在清单的类路径中尝试过的事情没有运气:

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

捆绑类路径:., ../META-INF/persistence.xml

捆绑类路径:., /META-INF/persistence.xml

捆绑类路径:., ./META-INF/persistence.xml

捆绑类路径:., META-INF

捆绑类路径:., ../META-INF

捆绑类路径:., /META-INF

捆绑类路径:., ./META-INF

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

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

4

8 回答 8

6

使用EclipseLink并忘记 Hibernate 和其他实现,因为:

  • 您将不得不过多地使用类加载器... Thread.currentThread().setContextClassLoader (...)

  • 您会很想设置 bundle-classpath 属性并手动添加依赖项,而不是安装 jar 包。

  • 您将收到provider not found错误,或者您可能无法找到persistence.xml

经过多次尝试,上述所有努力可能都不起作用。

然而,使用 EclipseLink 就很容易了,该实现被设计为在 OSGI 环境中开箱即用,并且没有任何类加载问题。

于 2009-07-22T01:19:05.167 回答
2
  1. (只是一个建议):如果你使用惰性加载器而不是在激活器中完成这项工作,那就更好了。例如,使用在 SimpleDaoImpl 构造函数中调用的单例。
  2. 将 META-INF/persistent.xml 移动到 src 文件夹(src/META-INF/persistent.xml)下,因为在开发 META-INF 文件夹下不在类路径中,它仅在运行时模式下有效。
  3. 如果您使用的是 EclipseLink jpa OSGi,则您的 MANIFEST.MF 缺少 JPA-PersistenceUnits 条目。添加

    JPA-PersistenceUnits:postgres

    进入 MANIFEST.MF。

  4. 然后在您的启动配置中将 org.eclipse.persistence.jpa.osgi 的启动级别(对于 ecliselink 2.3.x 否则 org.eclipse.persistence.jpa 对于 2.1.x)设置为 2,并将 javax.persistence 的启动级别设置为 1。

祝你好运,实际上 2.3 在部署中有问题,不能处理 bundleresource://xxxx URLs :(, 2.1.2 工作得很好;)

于 2011-10-13T14:46:25.833 回答
1

我没有使用persistence.xml,而是使用类似的hibernate.cfg.xml:

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

在我的激活器中,我通过捆绑上下文获取文件:这是一些示例代码,我如何执行它并引用该文件:>

私人无效initHibernate(BundleContext上下文){
        尝试 {
            最终 AnnotationConfiguration cfg = new AnnotationConfiguration();
            cfg.configure(context.getBundle().getEntry("/src/main/resource/hibernate/hibernate.cfg.xml"));
            sessionFactory = cfg.buildSessionFactory();

        } 捕捉(异常 e){
            // TODO 自动生成的 catch 块
        }
    }

如您所见,获取配置文件的行是:

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

如您所见,我的 hibernate.cfg.xml 不在 META-INF 文件夹中。它只是在 /src/ 下的根文件夹中......

希望有帮助。

克里斯托夫

于 2009-07-09T15:47:56.690 回答
1

您需要在类路径上有包含 META-INF 的目录。在每个目录中搜索 META-INF,如果找到,则搜索 persistence.xml。

如果您将“META-INF”放在类路径中,那么您需要在该目录中添加另一个 META-INF。

于 2010-03-09T16:34:31.920 回答
0

尝试在清单中使用这样的 Bundle-ClassPath

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

于 2009-06-30T06:02:35.477 回答
0

Meta-inf 目录不在类路径中。这应该只需将其放在您的src目录下即可。如果您希望它位于单独的位置,则必须指定 Bundle-Classpath 以包含该目录。默认情况下,类路径是 '.'。

于 2009-06-30T13:06:09.147 回答
0

我遇到了同样的问题。

我认为 eclipse 链接是在 OSGi 环境中使用的最佳选择。没有问题,因为您基本上将使用 JPA 实现。当您需要迁移到 Hibernate 时,只需替换 persintece.xml 配置和一些库。

于 2010-07-28T14:22:10.183 回答
0

您需要设置属性(对于休眠它会有所不同):

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

来电:

Persistence.createEntityManagerFactory(entityManagerFactoryName, properties)

让它工作。

如前所述,您需要类加载器包装。您可以使用https://issues.apache.org/jira/browse/OPENJPA-1783中的 ClassloaderEntityManager来执行此操作。

问候

于 2010-09-02T10:01:10.553 回答