【问题标题】:Usage of mule-module-jpa 1.2.0 with Hibernate in 3.4.0 CE. How to define EntityManager?在 3.4.0 CE 中将 mule-module-jpa 1.2.0 与 Hibernate 一起使用。如何定义实体管理器?
【发布时间】:2013-12-13 11:37:17
【问题描述】:

谁能指出一个适用于 Mule 3.4 CE 的 mule-module-jpa 的工作示例?

我看了很多次,花了一天的大部分时间尝试运行测试,但我一直在尝试在 mule 应用程序中设置正确定义的 entityManagerFactory。

当我看到这里描述模块功能的文章时,我很兴奋。 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 将通过 mule 更新站点安装的 1.2.0 版 mule-module-jpa 的 maven-mule-plugin 中的内容过时。

接下来,我查看了 https://github.com/mulesoft/mule-module-jpa/tree/master/src/test/resources 的 mule-module-jpa 源代码中的测试,看看我是否可以拼凑出一个解决方案。

使用我已经让 Studio 和/或 maven 使用该模块编译一个小型骡子应用程序,但它不会开始给出 Caused by: java.lang.ClassNotFoundException: org.hibernate.ejb.HibernatePersistence ,其根本原因是 Caused作者:java.lang.NoClassDefFoundError: org/hibernate/ejb/HibernatePersistence

我的 Maven 部门确实包含相关的 Hibernate 内容,并且我确实看到在 Studio 下运行时,这些 jar 包含在输出目录中。但是 mule 类加载器似乎无法找到它们......或者我对需要什么一无所知。

我已经尝试了几种 Hibernate 和 Spring-orm 版本的组合,目前正在使用每个版本中的最新版本:

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

我的 pom 的相关部分如下所示:

<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>

我的简单 mule 配置如下所示:

<?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>

我得到的完整例外是:

线程“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.ApplicationWrapper.init(ApplicationWrapper.java:64) 在 org.mule.module.launcher.DefaultMuleDeployer.deploy(DefaultMuleDeployer.java:47) 在 org.mule.tooling.server.application.ApplicationDeployer.run(ApplicationDeployer.java:58) 在 org.mule.tooling.server.application.ApplicationDeployer.main(ApplicationDeployer.java:91) 原因:org.mule.api.config.ConfigurationException:在 URL [file:/home/matthew/MuleStudio/workspace/.mule/apps/jpa_test2/jpa_test2.xml] 中定义名称为“entityManagerFactory”的 bean 创建错误:无法创建内部 bean 'org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter#495b317b' 类型 [org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter] 同时设置 bean 属性 'jpaVendorAdapter';嵌套异常是 org.springframework.beans.factory.BeanCreationException:在 URL [file:/home/matthew/MuleStudio/workspace/.mule 中定义的名称为 'org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter#495b317b' 的 bean 创建错误/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.builders.AbstractConfigurationBuilder.configure(AbstractConfigurationBuilder.java:52) 在 org.mule.config.builders.AbstractResourceConfigurationBuilder.configure(AbstractResourceConfigurationBuilder.java:78) 在 org.mule.context.DefaultMuleContextFactory.createMuleContext(DefaultMuleContextFactory.java:84) 在 org.mule.module.launcher.application.DefaultMuleApplication.init(DefaultMuleApplication.java:207) ... 4 更多 原因:org.mule.api.config.ConfigurationException:在 URL [file:/home/matthew/MuleStudio/workspace/.mule/apps/jpa_test2/jpa_test2.xml] 中定义名称为“entityManagerFactory”的 bean 创建错误:无法创建内部 bean 'org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter#495b317b' 类型 [org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter] 同时设置 bean 属性 'jpaVendorAdapter';嵌套异常是 org.springframework.beans.factory.BeanCreationException:在 URL [file:/home/matthew/MuleStudio/workspace/.mule 中定义的名称为 'org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter#495b317b' 的 bean 创建错误/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.java:52) 在 org.mule.config.builders.AbstractResourceConfigurationBuilder.configure(AbstractResourceConfigurationBuilder.java:78) 在 org.mule.config.builders.AutoConfigurationBuilder.autoConfigure(AutoConfigurationBuilder.java:101) 在 org.mule.config.builders.AutoConfigurationBuilder.doConfigure(AutoConfigurationBuilder.java:57) 在 org.mule.config.builders.AbstractConfigurationBuilder.configure(AbstractConfigurationBuilder.java:46) ... 7 更多 原因:org.mule.api.lifecycle.InitialisationException:在 URL [file:/home/matthew/MuleStudio/workspace/.mule/apps/jpa_test2/jpa_test2.xml] 中定义名称为“entityManagerFactory”的 bean 创建错误:无法创建内部 bean 'org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter#495b317b' 类型 [org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter] 同时设置 bean 属性 'jpaVendorAdapter';嵌套异常是 org.springframework.beans.factory.BeanCreationException:在 URL [file:/home/matthew/MuleStudio/workspace/.mule 中定义的名称为 'org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter#495b317b' 的 bean 创建错误/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.SpringXmlConfigurationBuilder.createSpringRegistry(SpringXmlConfigurationBuilder.java:119) 在 org.mule.config.spring.SpringXmlConfigurationBuilder.doConfigure(SpringXmlConfigurationBuilder.java:73) 在 org.mule.config.builders.AbstractConfigurationBuilder.configure(AbstractConfigurationBuilder.java:46) ... 11 更多 原因:org.springframework.beans.factory.BeanCreationException:在 URL [file:/home/matthew/MuleStudio/workspace/.mule/apps/jpa_test2/jpa_test2.xml] 中定义名称为“entityManagerFactory”的 bean 创建错误:无法创建内部 bean 'org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter#495b317b' 类型 [org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter] 同时设置 bean 属性 'jpaVendorAdapter';嵌套异常是 org.springframework.beans.factory.BeanCreationException:在 URL [file:/home/matthew/MuleStudio/workspace/.mule 中定义的名称为 'org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter#495b317b' 的 bean 创建错误/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.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveInnerBean(BeanDefinitionValueResolver.java:282) 在 org.springframework.beans.factory.support.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.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:461) 在 org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:295) 在 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223) 在 org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:292) 在 org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194) 在 org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1117) 在 org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:922) 在 org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:479) 在 org.mule.config.spring.SpringRegistry.doInitialise(SpringRegistry.java:89) 在 org.mule.registry.AbstractRegistry.initialise(AbstractRegistry.java:109) ... 14 更多 原因:org.springframework.beans.factory.BeanCreationException:在 URL [file:/home/matthew/MuleStudio/workspace/.mule 中定义名称为 'org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter#495b317b' 的 bean 创建错误/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.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1011) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:957) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:490) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:461) 在 org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveInnerBean(BeanDefinitionValueResolver.java:271) ... 28 更多 引起:org.springframework.beans.BeanInstantiationException:无法实例化bean类[org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter]:构造函数抛出异常;嵌套异常是 java.lang.NoClassDefFoundError: org/hibernate/ejb/HibernatePersistence 在 org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:163) 在 org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:87) 在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateBean(AbstractAutowireCapableBeanFactory.java:1004) ... 32 更多 引起:java.lang.NoClassDefFoundError: org/hibernate/ejb/HibernatePersistence 在 org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter.(HibernateJpaVendorAdapter.java:57) 在 sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 在 sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57) 在 sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 在 java.lang.reflect.Constructor.newInstance(Constructor.java:526) 在 org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:148) ... 34 更多 引起:java.lang.ClassNotFoundException:org.hibernate.ejb.HibernatePersistence 在 java.net.URLClassLoader$1.run(URLClassLoader.java: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:123) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:358) ... 40 更多

我开始认为该模块尚未准备好使用,尽管它可以作为工作室内部的云连接器使用?

【问题讨论】:

    标签: hibernate mule hibernate-entitymanager mule-module-jpa


    【解决方案1】:

    只是一个想法,mule 已经包含了一些 hibernate jar,包括 hibernate-core 和 hibernate-jpa。该错误可能是由于冲突引起的。尝试验证未找到的类是否已经在这些 jar 中。

    hth 加布里埃尔

    【讨论】:

    • 谢谢,是的,这显然与 3.6.0 提供的 mule 冲突。我以一种丑陋的方式解决了这个问题,却发现这个模块在其他方面被破坏了。
    • @mmeyer,你能帮我解决我的(可能是一样的)问题吗stackoverflow.com/questions/35195374/…
    【解决方案2】:

    我在这方面取得了一些进展,但还没有合适的解决方案在 Mule 中使用 JPA。

    来自 Mulesoft (https://github.com/mulesoft/mule-module-jpa/) 的 mule-module-jpa 似乎假定 Mule 的其他版本不是 3.4.0 CE,因为模块测试显示依赖于 Hibernate 3.6.3 但 Mule 3.4.0 已经包含 Hibernate Core 3.6 .0.这两个冲突。

    我发现可以将 ../MuleStudio/plugins/org.mule.tooling.server.3.4.0_3.4.0.201311292125/mule/opt 中的 Hibernate 核心替换为 Hibernate 4.2.8 等等因为它是通过 Maven 构建运行的,所以 Studio 可以很好地使用这个模块。

    为了让 Studio 不再抱怨 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 从它运行时不会抱怨替换。

    当我通过带注释的实体在 Mule 中运行一些 JPA 查询时,我很兴奋。

    当我发现这个 mule-module-jpa 1.2.0 无法提交 JPA 事务时,我的兴高采烈很快就被压垮了,无论它是否被包装在组件中。

    p>

    我看到其他一些用户也发现了将 EclipseLink 作为提供程序的问题。 Configuring the Mule JPA module to use Eclipse Link and MySQL

    尽管 Mulesoft 将其作为可用的 CloudConnector 提供,但该模块似乎尚未准备好使用。

    我真的希望这个项目能得到 Mule 的关注。它似乎已经准备就绪了。

    这里似乎确实有一个来自第 3 方的非官方但名称相同的模块:http://code.google.com/p/mule-transport-jpa/

    我已经确认我完全相同的 entityManager、persistenceProvider 和数据源设置在这个第 3 方模块上工作得很好。但是这个模块似乎只支持 XA txns 或者根本不支持。也就是说,它将所有 JPA 事务包装在自己的范围内,并且似乎无法加入由 Mule 的 SingleResourceTransaction 启动的任何 txn。

    如果您关心能否在 Mule 中使用 JPA,请投票支持这个问题和/或游说 Mulesoft 进行一些修复。

    【讨论】:

      【解决方案3】:

      Mule 在 ${MULE_HOME}/lib/opt 中包含休眠 JAR。它不包括 hibernate-entitymanager.jar。所以如果你不将它包含在你的类路径中,你会得到 ClassNotFound 异常。如果你确实包含它,它会给出 java.lang.IllegalAccessError,因为它与 mule 提供的休眠核心 JAR 冲突。

      所以解决方案是删除 ${MULE_HOME}/lib/opt 中的休眠 JAR 并添加您自己的 JAR 版本。做好备份,以防万一出错。

      更新

      您可以在 mule-deploy.properties 中尝试 loader.override="comma-separated list of classes or packages" 之类的选项。如果你提到一个类或包,mule app 类加载器将覆盖父类加载器。如果你提到一个带有减号的类,那么这个类/包将被阻止。有关更多详细信息,请参阅 mule 文档http://www.mulesoft.org/documentation/display/current/Classloader+Control+in+Mule#ClassloaderControlinMule-Fine-GrainedClassloadingControl

      【讨论】:

        猜你喜欢
        • 2014-09-25
        • 2016-10-19
        • 2014-09-06
        • 2016-03-24
        • 2013-10-13
        • 2014-07-16
        • 2020-01-24
        • 2014-09-08
        • 1970-01-01
        相关资源
        最近更新 更多