我已经在一个单独的捆绑包中实现了一个持久单位,包括 meta-inf/persistence.xml
。现在,我想在另一个插件中使用此捆绑包。但是,我无法实例化 entityManagerFactory
。
有关文件的内容,请参见下文。
什么有效
如果我将 meta-inf/persistence.xml
放入应用程序捆绑包中,以下是返回有效的 entityManagerFactory
EntityManagerFactory emf = new PersistenceProvider().createEntityManagerFactory("de.viate.muja.dao.jpa", <properties>);
什么不起作用
上面的行产生 null
如果 persistence.xml
仅在持久性捆绑包中。
eclipselink文档是指使用OSGI服务查找
context.getServiceReferences(EntityManagerFactory.class.getName(), "(osgi.unit.name=de.viate.muja.dao.jpa)");
这也不起作用。
在双子座页面上,有一个类 entityManagerFactoryBuilder
。不知道在OSGI上下文中定义了哪里!?
我该怎么做才能获得有效的服务参考?除了已经进口的那些(见下文)以及其中包括哪些捆绑包(请参见下文)(参见2022-03)?
另外:是否可以从持久性捆绑包中导入 persistence.xml
?
持久性捆绑包-Sustest.mg
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-SymbolicName: de.viate.muja.dao.bundle
Bundle-Version: 1.0.0
DynamicImport-Package: *
Export-Package: de.viate.muja.dao;version="1.0.0";uses:="jakarta.persi
stence,jakarta.persistence.metamodel,org.eclipse.persistence.descript
ors.changetracking,org.eclipse.persistence.indirection,org.eclipse.pe
rsistence.internal.descriptors,org.eclipse.persistence.internal.ident
itymaps,org.eclipse.persistence.internal.weaving,org.eclipse.persiste
nce.queries,org.eclipse.persistence.sessions"
Import-Package: jakarta.persistence;resolution:=optional,jakarta.persi
stence.metamodel;resolution:=optional,java.beans;resolution:=optional
,java.lang;resolution:=optional,java.lang.invoke;resolution:=optional
,java.util;resolution:=optional,java.util.function;resolution:=option
al,java.util.stream;resolution:=optional,org.eclipse.persistence.anno
tations;resolution:=optional,org.eclipse.persistence.descriptors.chan
getracking;resolution:=optional,org.eclipse.persistence.indirection;r
esolution:=optional,org.eclipse.persistence.internal.descriptors;reso
lution:=optional,org.eclipse.persistence.internal.identitymaps;resolu
tion:=optional,org.eclipse.persistence.internal.jpa;resolution:=optio
nal,org.eclipse.persistence.internal.weaving;resolution:=optional,org
.eclipse.persistence.queries;resolution:=optional,org.eclipse.persist
ence.sessions;resolution:=optional
Meta-Persistence: META-INF/persistence.xml
Require-Capability: osgi.ee;filter:="(&(osgi.ee=JavaSE)(version=17))"
持久束 - persistence.xml
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="de.viate.muja.dao.jpa" transaction-type="RESOURCE_LOCAL">
<class>[omitted for brevity]</class>
<shared-cache-mode>NONE</shared-cache-mode>
<properties>
<property name="eclipselink.weaving" value="static"/>
</properties>
</persistence-unit>
</persistence>
应用程序捆绑包-Sustest.mf
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-SymbolicName: de.viate.muja.ui
Bundle-Version: 1.0.0.qualifier
Bundle-RequiredExecutionEnvironment: JavaSE-17
Bundle-ActivationPolicy: lazy
Require-Bundle: org.eclipse.osgi;bundle-version="3.17.200",
org.osgi.service.jdbc;bundle-version="1.0.1",
jakarta.persistence-api;bundle-version="3.0.0",
org.eclipse.persistence.core;bundle-version="3.1.0",
org.eclipse.persistence.asm;bundle-version="9.1.1",
org.eclipse.persistence.jpa;bundle-version="3.1.0",
org.eclipse.persistence.jpa.jpql;bundle-version="3.1.0",
com.microsoft.sqlserver.mssql-jdbc;bundle-version="10.2.0",
de.viate.muja.dao.bundle;bundle-version="1.0.0"
I have implemented a persistence unit including META-INF/persistence.xml
in a separate bundle. Now I want to use this bundle in another plugin. However, I am not able to instantiate the EntityManagerFactory
.
See below for the contents of the relevant files.
What works
If I put META-INF/persistence.xml
into the application bundle than the following returns a valid EntityManagerFactory
EntityManagerFactory emf = new PersistenceProvider().createEntityManagerFactory("de.viate.muja.dao.jpa", <properties>);
What not works
The above line yields null
if persistence.xml
is only in the persistance bundle.
The EclipseLink documentation refers to Gemini with respect to OSGI. This site proposes the lookup using the OSGI services
context.getServiceReferences(EntityManagerFactory.class.getName(), "(osgi.unit.name=de.viate.muja.dao.jpa)");
This doesn't work too.
On the Gemini page there is a class EntityManagerFactoryBuilder
. No idea where it is defined in OSGI context!?
What can I do to get a valid service reference? Which bundles are necessary in addition to those already imported (see below) and in which Eclipse (2022-03) feature are they included?
Alternatively: is there a way to import persistence.xml
from the persistence bundle?
Persistence Bundle - MANIFEST.MG
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-SymbolicName: de.viate.muja.dao.bundle
Bundle-Version: 1.0.0
DynamicImport-Package: *
Export-Package: de.viate.muja.dao;version="1.0.0";uses:="jakarta.persi
stence,jakarta.persistence.metamodel,org.eclipse.persistence.descript
ors.changetracking,org.eclipse.persistence.indirection,org.eclipse.pe
rsistence.internal.descriptors,org.eclipse.persistence.internal.ident
itymaps,org.eclipse.persistence.internal.weaving,org.eclipse.persiste
nce.queries,org.eclipse.persistence.sessions"
Import-Package: jakarta.persistence;resolution:=optional,jakarta.persi
stence.metamodel;resolution:=optional,java.beans;resolution:=optional
,java.lang;resolution:=optional,java.lang.invoke;resolution:=optional
,java.util;resolution:=optional,java.util.function;resolution:=option
al,java.util.stream;resolution:=optional,org.eclipse.persistence.anno
tations;resolution:=optional,org.eclipse.persistence.descriptors.chan
getracking;resolution:=optional,org.eclipse.persistence.indirection;r
esolution:=optional,org.eclipse.persistence.internal.descriptors;reso
lution:=optional,org.eclipse.persistence.internal.identitymaps;resolu
tion:=optional,org.eclipse.persistence.internal.jpa;resolution:=optio
nal,org.eclipse.persistence.internal.weaving;resolution:=optional,org
.eclipse.persistence.queries;resolution:=optional,org.eclipse.persist
ence.sessions;resolution:=optional
Meta-Persistence: META-INF/persistence.xml
Require-Capability: osgi.ee;filter:="(&(osgi.ee=JavaSE)(version=17))"
Persistence Bundle - persistence.xml
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="de.viate.muja.dao.jpa" transaction-type="RESOURCE_LOCAL">
<class>[omitted for brevity]</class>
<shared-cache-mode>NONE</shared-cache-mode>
<properties>
<property name="eclipselink.weaving" value="static"/>
</properties>
</persistence-unit>
</persistence>
Application Bundle - MANIFEST.MF
Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-SymbolicName: de.viate.muja.ui
Bundle-Version: 1.0.0.qualifier
Bundle-RequiredExecutionEnvironment: JavaSE-17
Bundle-ActivationPolicy: lazy
Require-Bundle: org.eclipse.osgi;bundle-version="3.17.200",
org.osgi.service.jdbc;bundle-version="1.0.1",
jakarta.persistence-api;bundle-version="3.0.0",
org.eclipse.persistence.core;bundle-version="3.1.0",
org.eclipse.persistence.asm;bundle-version="9.1.1",
org.eclipse.persistence.jpa;bundle-version="3.1.0",
org.eclipse.persistence.jpa.jpql;bundle-version="3.1.0",
com.microsoft.sqlserver.mssql-jdbc;bundle-version="10.2.0",
de.viate.muja.dao.bundle;bundle-version="1.0.0"
发布评论
评论(1)
看看 aries jpa 实现 osgi jpa服务规范。
Look at Aries JPA which implements the OSGi JPA Service Specification.