1

Mule 3.4 CE に適した mule-module-jpa の実例を教えてもらえますか?

私は高低を調べて、テストを実行するために 1 日の大半を費やし、適切に定義された 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 更新サイト経由でインストールする mule-module-jpa の 1.2.0 バージョン用に Studio が 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 by: java .lang.NoClassDefFoundError: org/hibernate/ejb/HibernatePersistence

私のmaven depsには関連するHibernateのものが含まれており、スタジオで実行しているときにjarが出力ディレクトリに含まれていることがわかります。しかし、ミュールクラスローダーはそれらを見つけることができないようです...または、何が必要かわかりません。

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>

そして、私の単純なラバ構成は次のようになります。

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

私が得る完全な例外は次のとおりです。

Bean プロパティ「jpaVendorAdapter」の設定中に、タイプ [org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter] の内部 Bean「org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter#495b317b」を作成できません。ネストされた例外は org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter#495b317b' defined in 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 (org.mule.api.lifecycle. springframework.orm.jpa.vendor.HibernateJpaVendorAdapter] Bean プロパティ 'jpaVendorAdapter' の設定中。ネストされた例外は org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter#495b317b' defined in 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]: コンストラクターが例外をスローしました。ネストされた例外は、org.mule.config.builders.AbstractConfigurationBuilder の java.lang.NoClassDefFoundError: org/hibernate/ejb/HibernatePersistence (org.mule.api.lifecycle.InitialisationException) です。jpa.vendor.HibernateJpaVendorAdapter] Bean プロパティ 'jpaVendorAdapter' の設定中。ネストされた例外は org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter#495b317b' defined in 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]: コンストラクターが例外をスローしました。ネストされた例外は、org.mule.config.spring.SpringXmlConfigurationBuilder の java.lang.NoClassDefFoundError: org/hibernate/ejb/HibernatePersistence の org.mule.registry.AbstractRegistry.initialise(AbstractRegistry.java:117) です。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 [ファイル:/home/matthew/MuleStudio/workspace/.mule/apps/jpa_test2/jpa_test2.xml] で定義された名前 'entityManagerFactory' の Bean を作成中にエラーが発生しました: できませんBean プロパティ 'jpaVendorAdapter' を設定しながら、タイプ [org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter] の内部 Bean 'org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter#495b317b' を作成します。ネストされた例外は org.springframework.beans.factory.BeanCreationException: URL [file:/home/matthew/MuleStudio/workspace/.mule/apps/jpa_test2/jpa_test2.xml] で定義された名前 'org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter#495b317b' の Bean の作成中にエラーが発生しました: 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.java:282) at org.springframework.beans.factory.support.BeanDefinitionValueResolver. org.springframework.beans.factory.support の resolveValueIfNecessary(BeanDefinitionValueResolver.java:121)。URL [file:/home/matthew/MuleStudio/workspace/.mule/apps/jpa_test2/jpa_test2.xml] で定義された HibernateJpaVendorAdapter#495b317b': 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.java:1011) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory です。 createBeanInstance(AbstractAutowireCapableBeanFactory.java:957) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory. org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:461) で doCreateBean(AbstractAutowireCapableBeanFactory.java:490) 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 at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:163) at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy. java:87) org.

このモジュールは、スタジオ内からクラウド コネクタとして利用できるにもかかわらず、使用する準備ができていないと思い始めていますか?

4

3 に答える 3

1

私はこれである程度の進歩を遂げましたが、Mule で JPA を使用するための適切なソリューションはまだありません。

Mulesoft の mule-module-jpa ( https://github.com/mulesoft/mule-module-jpa/ ) は、モジュール テストが Hibernate 3.6.3 への依存関係を示しているため、3.4.0 CE 以外のバージョンの Mule を想定しているようです。ただし、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 で deps の欠落について文句を言わないようにするために、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 トランザクションをコミットできないことを発見したとき、私の高揚感はすぐに打ち砕かれました。

他の一部のユーザーが、プロバイダーとしての EclipseLink でもこの問題を発見したようです。 Eclipse Link と MySQL を使用するための Mule JPA モジュールの設定

このモジュールは、利用可能な CloudConnector として Mulesoft によって提供されていますが、使用する準備ができていないようです。

このプロジェクトが Mule の注目を集めることを願っています。準備万端に近づいたようです。

ここには、サードパーティからの非公式だが同じ名前のモジュールがあるようです: http://code.google.com/p/mule-transport-jpa/

まったく同じ entityManager、persistenceProvider、およびデータソースのセットアップが、このサードパーティ モジュールで問題なく動作することを確認しました。しかし、このモジュールは XA txns のみをサポートしているか、まったくサポートしていないようです。つまり、すべての JPA トランザクションを独自のスコープにラップし、Mule の SingleResourceTransaction によって開始された txn に参加できないようです。

Mule で JPA を使用できるようにすることに関心がある場合は、この質問に投票するか、Mulesoft にいくつかの修正を求めてロビー活動を行ってください。

于 2013-12-16T19:51:05.093 に答える
1

考えてみると、ミュールにはすでに hibernate-core や hibernate-jpa などの休止状態の jar がいくつか含まれています。競合が原因でエラーが発生した可能性があります。見つからないクラスがすでにこれらの jar のいずれかに含まれているかどうかを確認してください。

ガブリエル

于 2013-12-16T14:38:37.897 に答える