У меня проблема с JPA в среде OSGI.
Некоторая информация о среде и инфраструктуре:
- Средой выполнения является karaf 4.1.6.
- org.hibernate.osgi Версия 5.2.9.Final.
- hibernate-jpa-2.1-api
- org.apache.aries.jpa.container Версия 2.6.1
В моем проекте мне нужны две разные единицы персистентности для (почти) одинаковых классов сущностей, потому что мне нужно записать в две разные схемы Oracle.
Итак, у меня есть два источника данных, подобных этому (с разными параметрами):
<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
<bean id="oraDataSource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="oracle.jdbc.OracleDriver" />
<property name="url" value="jdbc:oracle:thin:@******" />
<property name="username" value="***" />
<property name="password" value="***" />
<property name="validationQuery" value="SELECT 1 FROM DUAL" />
<property name="initialSize" value="5"/>
<property name="maxIdle" value="5"/>
<property name="maxTotal" value="20"/>
</bean>
<service interface="javax.sql.DataSource" ref="oraDataSource">
<service-properties>
<entry key="osgi.jndi.service.name" value="jdbc/oraDataSource"/>
</service-properties>
</service>
Это упрощенный файл persistence.xml:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<persistence version="2.0"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<persistence-unit name="PU">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<non-jta-data-source>osgi:service/javax.sql.DataSource/(osgi.jndi.service.name=jdbc/oraDataSource)</non-jta-data-source>
<!-- orm class -->
.....
<class>my.path.jpa.model.Pratica</class>
<class>my.path.jpa.model.Tag</class>
......
<exclude-unlisted-classes>true</exclude-unlisted-classes>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.Oracle12cDialect"/>
<property name="hibernate.jdbc.use_streams_for_binary" value="false"/>
<!--<property name="hibernate.show_sql" value="true"/>-->
<property name="hibernate.hbm2ddl.auto" value="validate"/>
</properties>
</persistence-unit>
<persistence-unit name="SYM-PU">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<non-jta-data-source>osgi:service/javax.sql.DataSource/(osgi.jndi.service.name=jdbc/symOraDataSource)</non-jta-data-source>
<!-- orm class -->
.....
<class>my.path.jpa.model.Pratica</class>
<class>my.path.jpa.model.Tag</class>
......
<class>my.path.jpa.model.sym.PraticaSym</class>
<exclude-unlisted-classes>true</exclude-unlisted-classes>
<properties>
<property name="hibernate.dialect" value="org.hibernate.dialect.Oracle12cDialect"/>
<property name="hibernate.jdbc.use_streams_for_binary" value="false"/>
<!--<property name="hibernate.show_sql" value="true"/>-->
<property name="hibernate.hbm2ddl.auto" value="validate"/>
</properties>
</persistence-unit>
</persistence>
И это моя конфигурация плагина felix:
<plugin>
<groupId>org.apache.felix</groupId>
<artifactId>maven-bundle-plugin</artifactId>
<version>${maven.bundle.plugin.version}</version>
<extensions>true</extensions>
<configuration>
<instructions>
<Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName>
<Meta-Persistence>META-INF/persistence.xml</Meta-Persistence>
<Export-Package>
my.path.jpa*
</Export-Package>
<Import-Package>
org.hibernate.proxy, javassist.util.proxy, oracle.jdbc, *
</Import-Package>
<DynamicImport-Package>oracle.jdbc.driver</DynamicImport-Package>
</instructions>
</configuration>
</plugin>
КогдаЯ пытаюсь установить функцию, которая содержит этот пакет У меня появляется следующая ошибка только в первый раз Я пытаюсь установить:
2019-10-07T18:50:19,315 | ERROR | CM Configuration Updater (ManagedService Update: pid=[org.apache.aries.jpa.SYM-PU]) | lix.cm.impl.ConfigurationManager 1284 | 9 - org.apache.felix.configadmin - 1.8.16 | [org.osgi.service.cm.ManagedService, id=2531, bundle=8564/mvn:org.apache.aries.jpa/org.apache.aries.jpa.container/2.6.1]: Unexpected problem updating configuration org.apache.aries.jpa.SYM-PU
org.hibernate.boot.registry.classloading.spi.ClassLoadingException: Unable to load class [my.path.jpa.model.Tag]
at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.classForName(ClassLoaderServiceImpl.java:348) [8587:org.hibernate.core:5.2.9.Final]
at org.hibernate.boot.model.source.internal.annotations.AnnotationMetadataSourceProcessorImpl.<init>(AnnotationMetadataSourceProcessorImpl.java:104) [8587:org.hibernate.core:5.2.9.Final]
at org.hibernate.boot.model.process.spi.MetadataBuildingProcess$1.<init>(MetadataBuildingProcess.java:147) [8587:org.hibernate.core:5.2.9.Final]
at org.hibernate.boot.model.process.spi.MetadataBuildingProcess.complete(MetadataBuildingProcess.java:141) [8587:org.hibernate.core:5.2.9.Final]
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.metadata(EntityManagerFactoryBuilderImpl.java:858) [8587:org.hibernate.core:5.2.9.Final]
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:885) [8587:org.hibernate.core:5.2.9.Final]
at org.hibernate.osgi.OsgiPersistenceProvider.createContainerEntityManagerFactory(OsgiPersistenceProvider.java:96) [8589:org.hibernate.osgi:5.2.9.Final]
at org.apache.aries.jpa.container.impl.ManagedEMF.createAndPublishEMF(ManagedEMF.java:129) [8564:org.apache.aries.jpa.container:2.6.1]
at org.apache.aries.jpa.container.impl.ManagedEMF.updated(ManagedEMF.java:125) [8564:org.apache.aries.jpa.container:2.6.1]
at org.apache.felix.cm.impl.helper.ManagedServiceTracker.updated(ManagedServiceTracker.java:189) [9:org.apache.felix.configadmin:1.8.16]
at org.apache.felix.cm.impl.helper.ManagedServiceTracker.updateService(ManagedServiceTracker.java:152) [9:org.apache.felix.configadmin:1.8.16]
at org.apache.felix.cm.impl.helper.ManagedServiceTracker.provideConfiguration(ManagedServiceTracker.java:85) [9:org.apache.felix.configadmin:1.8.16]
at org.apache.felix.cm.impl.ConfigurationManager$ManagedServiceUpdate.provide(ConfigurationManager.java:1479) [9:org.apache.felix.configadmin:1.8.16]
at org.apache.felix.cm.impl.ConfigurationManager$ManagedServiceUpdate.run(ConfigurationManager.java:1435) [9:org.apache.felix.configadmin:1.8.16]
at org.apache.felix.cm.impl.UpdateThread.run0(UpdateThread.java:141) [9:org.apache.felix.configadmin:1.8.16]
at org.apache.felix.cm.impl.UpdateThread.run(UpdateThread.java:109) [9:org.apache.felix.configadmin:1.8.16]
at java.lang.Thread.run(Thread.java:748) [?:?]
Caused by: java.lang.ClassNotFoundException: Could not load requested class : my.path.jpa.model.Tag
at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl$AggregatedClassLoader.findClass(ClassLoaderServiceImpl.java:336) ~[?:?]
at java.lang.ClassLoader.loadClass(ClassLoader.java:424) ~[?:?]
at java.lang.ClassLoader.loadClass(ClassLoader.java:357) ~[?:?]
at java.lang.Class.forName0(Native Method) ~[?:?]
at java.lang.Class.forName(Class.java:348) ~[?:?]
at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.classForName(ClassLoaderServiceImpl.java:345) ~[?:?]
... 16 more
Если я пытаюсь установить функцию, все идет нормально!
Проблема всегда на втором устройстве персистентности. Если я пытаюсь инвертировать первый со вторым PU, объявляя SYM-PU первым, а не PU в persistence.xml, такая же проблема возникает на PU.
Заранее спасибо за ваши ответы.