我目前正在测试使用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
}
}
以下是我的目录结构:
alt text http://www.freeimagehosting.net/uploads/7b7b7d2d30.jpg
这是我的 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 包含所有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>
我在Manifest的Classpath中尝试过没有运气的事情:
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
答案 0 :(得分:5)
使用EclipseLink并忘记Hibernate和其他实现,因为:
你必须过多地使用类加载器...... Thread.currentThread()。setContextClassLoader (...)
您很想设置bundle-classpath属性并手动添加依赖项,而不是安装jar包。
您将收到提供商未找到错误,或者您可能无法找到 persistence.xml
经过多次尝试后,上述所有努力都可能无效。
然而,使用EclipseLink并不是一件容易的事,实现的目的是在OSGI环境中开箱即用,并且没有任何类加载问题。
答案 1 :(得分:2)
如果您使用的是EclipseLink jpa OSGi,则您的MANIFEST.MF缺少JPA-PersistenceUnits条目。添加
JPA-PersistenceUnits:postgres
进入MANIFEST.MF。
好运,实际上2.3在部署中有问题,不处理bundleresource:// xxxx网址:(,2.1.2效果很好;)
答案 2 :(得分:1)
我没有使用persistence.xml,而是使用类似的hibernate.cfg.xml:
src/main/resource/hibernate/hibernate.cfg.xml
在我的Activator中,我通过bundle上下文获取文件: 以下是一些示例代码,如何执行此操作并引用该文件:&gt;
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")
正如您所看到的,我的hibernate.cfg.xml不在META-INF文件夹中。它位于/ src /......
下的根文件夹中希望有所帮助。
了Christoph
答案 3 :(得分:1)
您需要在类路径上包含包含META-INF的目录。搜索每个目录的META-INF,如果找到,则搜索persistence.xml。
如果你在类路径上放了“META-INF”,那么你在该目录中需要另一个META-INF。
答案 4 :(得分:0)
尝试在清单中使用像这样的Bundle-ClassPath
Bundle-ClassPath:。,/ location / of / persistent.xml
答案 5 :(得分:0)
Meta-inf目录不在类路径中。这应该只需将其放在 src 目录下即可。如果您希望它位于单独的位置,则必须指定Bundle-Classpath以包含该目录。默认情况下,类路径为'。'。
答案 6 :(得分:0)
我遇到了同样的问题。
我认为eclipse链接是在OSGi环境中使用的最佳选择。并且没有问题,因为您将基本上使用JPA实现。当您需要转移到Hibernate时,只需替换persintece.xml配置和一些库。
答案 7 :(得分:0)
你需要设置属性(对于hibernate,它会有所不同):
javax.persistence.provider = org.apache.openjpa.persistence.PersistenceProviderImpl
致电:
Persistence.createEntityManagerFactory(entityManagerFactoryName,properties)
让它发挥作用。
如前所述,您需要类加载器包装。您可以使用https://issues.apache.org/jira/browse/OPENJPA-1783中的ClassloaderEntityManager来执行此操作。
此致