Использование mule-module-jpa 1.2.0 с Hibernate в 3.4.0 CE. Как определить EntityManager?

Может ли кто-нибудь указать мне на рабочий пример mule-module-jpa, подходящий для Mule 3.4 CE?

Я смотрел вверх и вниз и потратил большую часть дня, пытаясь запустить тест, и застрял, пытаясь получить правильно определенный entityManagerFactory, установленный внутри приложения mule.

Я был в восторге, когда увидел здесь статью с описанием возможностей модулей. http://blogs.mulesoft.org/getting-started-with-jpa-and-mule/ К сожалению, в этой статье нет подробностей о настройке модуля.

Затем я нашел репозиторий github для модуля (https://github.com/mulesoft/mule-module-jpa) и перешел по ссылке на «документацию» на https://github.com/mulesoft/mule-module-jpa. Опять нет подробностей о конфигурации entityManager. Также заметил, что информация maven, похоже, устарела с тем, что Studio поместит в maven-mule-plugin для версии 1.2.0 mule-module-jpa, которую Studio установит через сайт обновления mule.

Затем я просмотрел тест в источнике mule-module-jpa по адресу https://github.com/mulesoft/mule-module-jpa/tree/master/src/test/resources, чтобы узнать, смогу ли я придумать решение.

Используя это, я получил Studio и / или maven для компиляции небольшого приложения mule с использованием модуля, но он не начнет выдавать исключение Caused by: java.lang.ClassNotFoundException: org.hibernate.ejb.HibernatePersistence с основной причиной, вызванной: java .lang.NoClassDefFoundError: org / hibernate / ejb / HibernatePersistence

Мои maven deps действительно включают соответствующий материал Hibernate, и я вижу, что банки включены в выходной каталог при работе в студии. Но загрузчик классов mule, похоже, не может их найти ... или я не знаю, что нужно.

Я пробовал несколько комбинаций версий Hibernate и Spring-orm и в настоящее время использую последнюю из них:

<spring.version>4.0.0.RELEASE</spring.version>
<hibernate.version>4.2.2.Final</hibernate.version>

Соответствующие части моей помпы выглядят так:

<dependencies>
...
      <dependency>
        <groupId>org.mule.modules</groupId>
        <artifactId>mule-module-jpa</artifactId>
        <version>1.2.0</version>
    </dependency>
     <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>${hibernate.version}</version> 
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-entitymanager</artifactId>
        <version>${hibernate.version}</version>    
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-validator-annotation-processor</artifactId>
        <version>4.1.0.Final</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.26</version>
    </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-orm</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>${spring.version}</version>
        </dependency>
</dependencies>


<plugins>
...
<plugin>
                <groupId>org.mule.tools</groupId>
                <artifactId>maven-mule-plugin</artifactId>
                <version>1.9</version>
                <extensions>true</extensions>
                <configuration>
                    <copyToAppsDirectory>true</copyToAppsDirectory>
                <inclusions>
                        <inclusion>
                            <groupId>org.mule.modules</groupId>
                            <artifactId>mule-module-jpa</artifactId>
                        </inclusion>
                    </inclusions>
                </configuration>
            </plugin>
</plugins>

А моя простая конфигурация мула выглядит так:

<?xml version="1.0" encoding="UTF-8"?>
<mule version="CE-3.4.0"
xmlns:http="http://www.mulesoft.org/schema/mule/http" 
xmlns:jpa="http://www.mulesoft.org/schema/mule/jpa" 
xmlns="http://www.mulesoft.org/schema/mule/core" 
xmlns:doc="http://www.mulesoft.org/schema/mule/documentation"
xmlns:spring="http://www.springframework.org/schema/beans" 
xmlns:util="http://www.springframework.org/schema/util"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-current.xsd
http://www.mulesoft.org/schema/mule/core http://www.mulesoft.org/schema/mule/core/current/mule.xsd
http://www.mulesoft.org/schema/mule/http http://www.mulesoft.org/schema/mule/http/current/mule-http.xsd
http://www.mulesoft.org/schema/mule/jpa http://www.mulesoft.org/schema/mule/jpa/1.0/mule-jpa.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.1.xsd
">

      <spring:beans>
      <spring:bean id="datasource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <spring:property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <spring:property name="url" value="jdbc:mysql://localhost:3306/test"/>
        <spring:property name="username" value="XXXX"/>
        <spring:property name="password" value="XXXX"/>
    </spring:bean>

    <spring:bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <spring:property name="dataSource" ref="datasource"/>
        <spring:property name="jpaVendorAdapter">
            <spring:bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                <spring:property name="showSql" value="true"/>
                <spring:property name="generateDdl" value="false"/>
                <spring:property name="databasePlatform" value="org.hibernate.dialect.MySQL5Dialect"/>
            </spring:bean>
        </spring:property>
    </spring:bean>
    </spring:beans>

    <jpa:config name="Java_Persistence_API" entityManagerFactory-ref="entityManagerFactory" doc:name="Java Persistence API"/>

    <flow name="jpa_test2Flow1" doc:name="jpa_test2Flow1">
        <http:inbound-endpoint exchange-pattern="request-response" host="localhost" port="8081" path="query" doc:name="HTTP"/>
        <logger level="INFO" doc:name="Logger"/>
        <jpa:find config-ref="Java_Persistence_API" entityClass="domain.Dog" id-ref="#[message.payload.name]" doc:name="Java Persistence API"/>
    </flow>
</mule>

Полное исключение, которое я получаю:

Я начинаю думать, что этот модуль не готов к использованию, несмотря на то, что он доступен как облачный коннектор изнутри студии?

просто подумал, mule уже включает несколько jar-файлов спящего режима, включая hibernate-core и hibernate-jpa. ошибка может быть вызвана конфликтом. попробуйте проверить, находится ли класс, который не найден, уже в одной из этих банок.


person mmeyer    schedule 13.12.2013    source источник


Ответы (3)


hth габриэль

Я добился некоторого прогресса в этом, но пока у меня нет подходящего решения для использования JPA в Mule.

person Gabriel Dimech    schedule 16.12.2013
comment
@mmeyer, не могли бы вы помочь с моей (может быть такой же) проблемой stackoverflow.com/questions/35195374/ - person mmeyer; 16.12.2013
comment
Исключение в потоке «main» org.mule.module.launcher.DeploymentInitException: ClassNotFoundException: org.hibernate.ejb.HibernatePersistence в org.mule.module.launcher.application.DefaultMuleApplication.init (DefaultMuleApplication.java:219) в org.mule.module.launcher.application.DefaultMuleApplication.init (DefaultMuleApplication.java:219) .module.launcher.application.ApplicationWrapper.init (ApplicationWrapper.java:64) в org.mule.module.launcher.DefaultMuleDeployer.deploy (DefaultMuleDeployer.java:47) в org.mule.tooling.server.application.ApprlicationDuncher. (ApplicationDeployer.java:58) в org.mule.tooling.server.application.ApplicationDeployer.main (ApplicationDeployer.java:91) Причина: org.mule.api.config.ConfigurationException: ошибка при создании bean-компонента с определенным именем entityManagerFactory в URL [файл: /home/matthew/MuleStudio/workspace/.mule/apps/jpa_test2/jpa_test2.xml]: невозможно создать внутренний bean-компонент org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter # 495b317b 'типа [org. springframework.orm.jpa.vendor.HibernateJpaVendorAdapter] при установке свойство bean-компонента ting 'jpaVendorAdapter'; вложенное исключение - org.springframework.beans.factory.BeanCreationException: ошибка при создании bean-компонента с именем org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter # 495b317b, определенным в URL-адресе [файл: /home/matthew/MuleStudio/workspace /apps/jpa_test2/jpa_test2.xml]: создание bean-компонента не удалось; вложенное исключение - org.springframework.beans.BeanInstantiationException: не удалось создать экземпляр класса bean-компонента [org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter]: конструктор сгенерировал исключение; вложенным исключением является java.lang.NoClassDefFoundError: org / hibernate / ejb / HibernatePersistence (org.mule.api.lifecycle.InitialisationException) (org.mule.api.config.ConfigurationException) в org.mule.config.configurationException) в org.mule.config.configurationException. (AbstractConfigurationBuilder.java:52) в org.mule.config.builders.AbstractResourceConfigurationBuilder.configure (AbstractResourceConfigurationBuilder.java:78) в org.mule.context.DefaultMuleContextFactory.createMuleContext.MuleContextFactory.createMuleContext. launcher.application.DefaultMuleApplication.init (DefaultMuleApplication.java:207) ... еще 4 Причина: org.mule.api.config.ConfigurationException: ошибка при создании bean-компонента с именем 'entityManagerFactory', определенным в URL [file: / home / matthew /MuleStudio/workspace/.mule/apps/jpa_test2/jpa_test2.xml]: невозможно создать внутренний bean-компонент org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter # 495b317b 'типа [org.springframevend.or .jpa.jpa. HibernateJpaVendorAdapter] при установке свойства bean-компонента 'jpaVendorAdapter'; вложенное исключение - org.springframework.beans.factory.BeanCreationException: ошибка при создании bean-компонента с именем org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter # 495b317b, определенным в URL-адресе [файл: /home/matthew/MuleStudio/workspace /apps/jpa_test2/jpa_test2.xml]: создание bean-компонента не удалось; вложенное исключение - org.springframework.beans.BeanInstantiationException: не удалось создать экземпляр класса bean-компонента [org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter]: конструктор сгенерировал исключение; вложенное исключение - это java.lang.NoClassDefFoundError: org / hibernate / ejb / HibernatePersistence (org.mule.api.lifecycle.InitialisationException) в org.mule.config.builders.AbstractConfigurationBuilder.configure (AbstractConfigurationBuilder.org.mule.config.configurationBuilder.configure (AbstractConfiguration.Builder) org.mule.api.lifecycle.InitialisationException) .config.builders.AbstractResourceConfigurationBuilder.configure (AbstractResourceConfigurationBuilder.java:78) в org.mule.config.builders.AutoConfigurationBuilder.autoConfigure (AutoConfigurationBuilder.java:101) в org.muleders.configure : 57) в org.mule.config.builders.AbstractConfigurationBuilder.configure (AbstractConfigurationBuilder.java:46) ... еще 7 Причин: org.mule.api.lifecycle.InitialisationException: Ошибка при создании bean-компонента с именем 'entityManagerFactory', определенным в URL [файл: /home/matthew/MuleStudio/workspace/.mule/apps/jpa_test2/jpa_test2.xml]: невозможно создать внутренний bean-компонент org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter # 4 95b317b 'типа [org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter] при установке свойства bean-компонента' jpaVendorAdapter '; вложенное исключение - org.springframework.beans.factory.BeanCreationException: ошибка при создании bean-компонента с именем org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter # 495b317b, определенным в URL-адресе [файл: /home/matthew/MuleStudio/workspace /apps/jpa_test2/jpa_test2.xml]: создание bean-компонента не удалось; вложенное исключение - org.springframework.beans.BeanInstantiationException: не удалось создать экземпляр класса bean-компонента [org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter]: конструктор сгенерировал исключение; вложенное исключение - это java.lang.NoClassDefFoundError: org / hibernate / ejb / HibernatePersistence в org.mule.registry.AbstractRegistry.initialise (AbstractRegistry.java:117) в org.mule.config.spring.SpringXmlConfigurationBuilingSpringXmlConfigurationBuilderBuilderBuilder (SpringXmlConfigurationBuil 119) в org.mule.config.spring. SpringXmlConfigurationBuilder.doConfigure (SpringXmlConfigurationBuilder.java:73) в org.mule.config.builders.AbstractConfigurationBuilder.configure (AbstractConfigurationBuilder.java:46) ... еще 11 Вызвано: org.springframework.beans: ErrorCreation beans.factory. с именем entityManagerFactory, определенным в URL [file: /home/matthew/MuleStudio/workspace/.mule/apps/jpa_test2/jpa_test2.xml]: Невозможно создать внутренний bean-компонент org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter # 49 'типа [org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter] при установке свойства bean-компонента' jpaVendorAdapter '; вложенное исключение - org.springframework.beans.factory.BeanCreationException: ошибка при создании bean-компонента с именем org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter # 495b317b, определенным в URL-адресе [файл: /home/matthew/MuleStudio/workspace /apps/jpa_test2/jpa_test2.xml]: создание bean-компонента не удалось; вложенное исключение - org.springframework.beans.BeanInstantiationException: не удалось создать экземпляр класса bean-компонента [org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter]: конструктор сгенерировал исключение; вложенное исключение - это java.lang.NoClassDefFoundError: org / hibernate / ejb / HibernatePersistence at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveInnerBean (в BeanDefinitionValueResolver. resolveValueIfNecessary (BeanDefinitionValueResolver.java:121) при org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues ​​(AbstractAutowireCapableBeanFactory.java:1391) при org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean (AbstractAutowireCapableBeanFactory.java:1132) на org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java:522) на org.spring.framework.beans.factory.support.Abctory.AbstractArameworkCreateBean (AbstractAutowireCapableBeanFactory.java:522) на org.spring. .support.AbstractBeanFa ctory $ 1.getObject (AbstractBeanFactory.java:295) на org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton (DefaultSingletonBeanRegistry.java:223) на org.springframework.beans.doanetactory.support. : 292) на сайте org.springframework.beans.factory.support. AbstractBeanFactory.getBean (AbstractBeanFactory.java:194) в org.springframework.context.support.AbstractApplicationContext.getBean (AbstractApplicationContext.java:1117) в org.springframework.context.support.Contextation.ApplicationFramework.context.support.Abstracta.java.support. .springframework.context.support.AbstractApplicationContext.refresh (AbstractApplicationContext.java:479) по адресу org.mule.config.spring.SpringRegistry.doInitialise (SpringRegistry.java:89) по адресу org.mule.registry Abstract.AbstractRegistry.java.in : 109) ... еще 14 Причина: org.springframework.beans.factory.BeanCreationException: Ошибка создания bean-компонента с именем org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter # 495b317b 'определенным в URL [file: / home / matthew / MuleStudio / workspace / .mule / apps / jpa_test2 / jpa_test2.xml]: создание bean-компонента не удалось; вложенное исключение - org.springframework.beans.BeanInstantiationException: не удалось создать экземпляр класса bean-компонента [org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter]: конструктор сгенерировал исключение; вложенное исключение - java.lang.NoClassDefFoundError: org / hibernate / ejb / HibernatePersistence at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean (AbstractAutowireCapableBeanFactory.instantiateBean (AbstractAutowireCapableBeanFactory.instantiateBean (AbstractAutowireCapableBeanFactory.instantiateBean) createBeanInstance (AbstractAutowireCapableBeanFactory.java:957) при org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean (AbstractAutowireCapableBeanFactory.java:490) при org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean (AbstractAutowireCapableBeanFactory.java:461) at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveInnerBean (BeanDefinitionValueResolver.java:271) ... еще 28 Вызвано: org.springframework.beans.BeanInstantiationException. .vendor.HibernateJpaVendorAdapter]: конструктор сгенерировал исключение. ция; вложенное исключение - это java.lang.NoClassDefFoundError: org / hibernate / ejb / HibernatePersistence в org.springframework.beans.BeanUtils.instantiateClass (BeanUtils.java:163) в org.springframework.beans.factory.InstantiateClass (BeanUtils.java:163) в org.springframework.beans.factory.Instance. java: 87) в org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean (AbstractAutowireCapableBeanFactory.java:1004). .. еще 32 Вызвано: java.lang.NoClassDefFoundError: org / hibernate / ejb / HibernatePersistence at org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter. (HibernateJpaVendorAdapter.java:flectAnative Sun. Method) в sun.reflect.NativeConstructorAccessorImpl.newInstance (NativeConstructorAccessorImpl.java:57) в sun.reflect.DelegatingConstructorAccessorImpl.newInstance (DelegatingConstructorAccessorImpl.java:45) в java.lang.reflect.Constructor.Instructor. org.springframework.beans.BeanUtils.instantiateClass (BeanUtils.java:148) ... Еще 34 Вызвано: java.lang.ClassNotFoundException: org.hibernate.ejb.HibernatePersistence в java.net.URLClassLoader $ 1.run (URLClasslass : 366) в java.net.URLClassLoader $ 1.run (URLClassLoader.java:355) в java.security.AccessController.doPrivileged (собственный метод) в java.net.URLClassLoader.findClass (URLClassLoader.java:354) в org. mule.module.launcher.FineGrainedControlClassLoader.findClass (FineGrainedControlClassLoader.java:179) в org.mule.module.launcher.FineGrainedControlClassLoader.loadClass (FineGrainedControlClassLoader.java:123ClassLoader.java:123.classLoader.java:123. ... еще 40 - person May12; 04.02.2016

Mule-module-jpa от Mulesoft (https://github.com/mulesoft/mule-module-jpa/), похоже, предполагает некоторую другую версию Mule, чем 3.4.0 CE, потому что тесты модулей показывают зависимости от Hibernate 3.6.3, но Mule 3.4.0 уже включает Hibernate Core 3.6.0. Эти два конфликта.

Я обнаружил, что можно заменить ядро ​​Hibernate в ../MuleStudio/plugins/org.mule.tooling.server.3.4.0_3.4.0.201311292125/mule/opt на Hibernate 4.2.8 и при условии, что это запускается как через сборку Maven, Studio отлично работает с этим модулем.

Чтобы Studio перестала жаловаться на отсутствие deps в Hibernate 3.6.0, я также взломал файлы MANIFEST.MF и MULESOFT.SF (на /MuleStudio/plugins/org.mule.tooling.server.3.4.0_3.4.0.201311292125/META -INF /) для ссылки на Hibernate 4.2.8. Контрольные суммы SHA-1 в нем не имеют значения, очевидно, поскольку Studio и Mule CE, запущенные из него, не жалуются на замену.

После того, как я обошел этот путь, я был взволнован, когда получил несколько запросов JPA, запущенных в Mule через аннотированные объекты.

Мой восторг был быстро подавлен, когда я обнаружил, что этот mule-module-jpa 1.2.0 не может фиксировать транзакции JPA при любом варианте сохранения или слияния, который я бросил на него, и независимо от того, был ли он заключен в компонент.

Я вижу, что некоторые другие пользователи также обнаружили эту проблему с EclipseLink в качестве поставщика. Настройка модуля Mule JPA для использования Eclipse Link и MySQL

Похоже, этот модуль не готов к использованию, несмотря на то, что Mulesoft предлагает его в качестве доступного CloudConnector.

Я очень надеюсь, что этот проект привлечет внимание Mule. Кажется, это так близко к тому, чтобы быть готовым.

Кажется, здесь есть неофициальный, но с таким же названием модуль от стороннего производителя: http://code.google.com/p/mule-transport-jpa/

Я подтвердил, что моя точно такая же настройка entityManager, persistenceProvider и источника данных отлично работает с этим сторонним модулем. Но этот модуль, похоже, поддерживает только XA txns или вообще не поддерживает. То есть он обертывает все свои транзакции JPA в своей собственной области и, похоже, не может присоединиться к любому txn, запущенному SingleResourceTransaction Mule.

Если вас беспокоит возможность использовать JPA в Mule, проголосуйте за этот вопрос и / или попросите Mulesoft внести некоторые исправления.

Mule включает файлы JAR для гибернации в $ {MULE_HOME} / lib / opt. Он не включает hibernate-entitymanager.jar. Поэтому, если вы не включите его в свой путь к классам, вы получите исключение ClassNotFound. Если вы включите его, он выдаст ошибку java.lang.IllegalAccessError, поскольку он конфликтует с предоставленными mule базовыми JAR-файлами спящего режима.

person mmeyer    schedule 16.12.2013

Поэтому решение - удалить файлы JAR спящего режима в $ {MULE_HOME} / lib / opt и добавить свои собственные версии JAR. Сделайте резервную копию на случай ошибки.

Обновить

Вы можете попробовать такие параметры, как loader.override = "список классов или пакетов, разделенных запятыми", в mule-deploy.properties. Если вы упомянули класс или пакет, загрузчик классов приложения mule переопределит родительский загрузчик классов. Если вы укажете класс, перед которым стоит минус, этот класс / пакет будет заблокирован. Дополнительные сведения см. В документации по мулу. http://www.mulesoft.org/documentation/display/current/Classloader+Control+in+Mule#ClassloaderControlinMule-Fine-GrainedClassloadingControl

Спасибо, да, это явно был конфликт с предоставленным мулом 3.6.0. Я обошел это некрасивым способом только для того, чтобы обнаружить, что этот модуль сломан иным образом.

person Bipul    schedule 06.01.2014