2012-07-30 8 views
9

eclipselink(2.4.0)とspring-data-jpa(1.1.0.RELEASE)を組み合わせてソリューションを実装しようとしています。しかし、私は(Tomcatの7)ソリューションを導入するたびに、私は次の例外を取得:Eclipselink&Spring Data

サービスクラス

Caused by: java.lang.IllegalArgumentException: No [ManagedType] was found for 
the key class [com.acme.domain.entities.User] in the Metamodel - please 
verify that the [Managed] class was referenced in persistence.xml using a 
specific <class>com.acme.domain.entities.User</class> property or a global 
<exclude-unlisted-classes>false</exclude-unlisted-classes> element. 

リポジトリオートワイヤリングが場所(以下のコード例)を取るときに発生するように見えますpersistence.xmlの

@Component 
public class UserDataService { 

    @Autowired 
    private UserRepository userRepository; 

    ... 
} 

Entityクラス

package com.acme.domain.entities; 

... 

@Entity 
@Table(name = "users") 
public class User implements Serializable { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "user_id") 
    private Integer id; 

    ... 

} 
<persistence-unit name="default" transaction-type="RESOURCE_LOCAL"> 
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>  
    <class>com.acme.domain.entities.User</class> 

    ... 
</persistence-unit> 

これは、スプリングとeclipselinkの間に矛盾がありますか?

UPDATE:

STACKTRACE ...

[#|2012-07-31 16:25:02,317|ERROR|pool-2-thread-40|org.springframework.web.context.ContextLoader|Context initialization failed|#] 
    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userDataService': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.acme.data.repositories.UserRepository com.acme.data.services.UserDataService.userRepository; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userRepository': FactoryBean threw exception on object creation; nested exception is java.lang.IllegalArgumentException: No [ManagedType] was found for the key class [com.acme.domain.entities.User] in the Metamodel - please verify that the [Managed] class was referenced in persistence.xml using a specific <class>com.acme.domain.entities.User</class> property or a global <exclude-unlisted-classes>false</exclude-unlisted-classes> element. 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:287) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1106) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:517) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:456) 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:294) 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:225) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:291) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:609) 
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:918) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:469) 
    at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:383) 
    at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:283) 
    at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:112) 
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4779) 
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5273) 
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) 
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:897) 
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:873) 
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:615) 
    at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:958) 
    at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1599) 
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441) 
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:138) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
    at java.lang.Thread.run(Thread.java:680) 
Caused by: org.springframework.beans.factory.BeanCreationException: Could not autowire field: private com.acme.data.repositories.UserRepository com.acme.data.services.UserDataService.userRepository; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userRepository': FactoryBean threw exception on object creation; nested exception is java.lang.IllegalArgumentException: No [ManagedType] was found for the key class [com.acme.domain.entities.User] in the Metamodel - please verify that the [Managed] class was referenced in persistence.xml using a specific <class>com.acme.domain.entities.User</class> property or a global <exclude-unlisted-classes>false</exclude-unlisted-classes> element. 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:512) 
    at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:92) 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:284) 
    ... 27 more 
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userRepository': FactoryBean threw exception on object creation; nested exception is java.lang.IllegalArgumentException: No [ManagedType] was found for the key class [com.acme.domain.entities.User] in the Metamodel - please verify that the [Managed] class was referenced in persistence.xml using a specific <class>com.acme.domain.entities.User</class> property or a global <exclude-unlisted-classes>false</exclude-unlisted-classes> element. 
    at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:149) 
    at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.getObjectFromFactoryBean(FactoryBeanRegistrySupport.java:102) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getObjectForBeanInstance(AbstractBeanFactory.java:1442) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:305) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:876) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:818) 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:735) 
    at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:484) 
    ... 29 more 
Caused by: java.lang.IllegalArgumentException: No [ManagedType] was found for the key class [com.acme.domain.entities.User] in the Metamodel - please verify that the [Managed] class was referenced in persistence.xml using a specific <class>com.acme.domain.entities.User</class> property or a global <exclude-unlisted-classes>false</exclude-unlisted-classes> element. 
    at org.eclipse.persistence.internal.jpa.metamodel.MetamodelImpl.entityEmbeddableManagedTypeNotFound(MetamodelImpl.java:174) 
    at org.eclipse.persistence.internal.jpa.metamodel.MetamodelImpl.managedType(MetamodelImpl.java:489) 
    at org.springframework.data.jpa.repository.support.JpaMetamodelEntityInformation.<init>(JpaMetamodelEntityInformation.java:58) 
    at org.springframework.data.jpa.repository.support.JpaEntityInformationSupport.getMetadata(JpaEntityInformationSupport.java:65) 
    at org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getEntityInformation(JpaRepositoryFactory.java:149) 
    at org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getTargetRepository(JpaRepositoryFactory.java:87) 
    at org.springframework.data.jpa.repository.support.JpaRepositoryFactory.getTargetRepository(JpaRepositoryFactory.java:70) 
    at org.springframework.data.repository.core.support.RepositoryFactorySupport.getRepository(RepositoryFactorySupport.java:137) 
    at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.getObject(RepositoryFactoryBeanSupport.java:125) 
    at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.getObject(RepositoryFactoryBeanSupport.java:41) 
    at org.springframework.beans.factory.support.FactoryBeanRegistrySupport.doGetObjectFromFactoryBean(FactoryBeanRegistrySupport.java:142) 
    ... 37 more 
+0

完全なスタックトレースを含めることができます。それはメタモデルだけなのですか他のものはうまくいかないのですか? – James

+0

私は上記のstacktraceを追加しました。自分のリポジトリ実装を追加していれば問題ありません。つまり、パズルのeclipselink部分は問題ありません。私がspring-data-jpaを追加するとすぐに、上記の問題が発生します。 – NubieJ

+0

スタンドアロンアプリケーションでこの全く同じ問題が発生した場合は、どのような更新もありますか? – JBA

答えて

1

私は私の問題を解決することができたが、それは上記のもののように別の設定だった、私はちょうど私がするまでを偶然見つけいくつかのことを追加私はSE環境で解決することができました:

  • バグhttps://bugs.eclipse.org/bugs/show_bug.cgi?id=338837は、EclipseLinkバージョン2.2.0およびそれ以降のバージョンに影響します。主にローカル環境(RESOURCE_LOCAL)で起こっています。 EclipseLinkのバージョンアップグレードするか、次の回避策を助けるかもしれない:
  • すべて同じ永続ユニット名を定義することをクラスパスにある複数のpersistence.xmlファイル(特に第3回パーティのJARファイル内)を有する
<exclude-unlisted-classes>false</exclude-unlisted-classes> 
  • (上記の「デフォルト」は非常に一般的かもしれません)。この場合は、最初のステップとしてpersistence-unit-nameの名前を変更してみてください

  • persistence-unit-nameの名前を変更した場合、以前の値に戻して問題を再現すると、上記の第三者JARビルドに含まれる独自のプロジェクトbeeingてのか古いのJAR Finaly(Mavenのビルドはまだリポジトリから古いビルド成果物を取ることができる例えばので、例えばリファクタリング/プロジェクトレベルでの名前変更または類似の構造を変更)

それは私のセットアップ(Spring-Standalone Application、persistence.xmlはありませんが、カスタム会社フレームワークが使用されているため、Spring-tonsトンのトン)になります。それは、私が広告を忘れたことを示しましたJAR依存関係からサービス実装を行うのではなく、自分のサービス実装(Spring Bean実装)を自分のローカルプロジェクトで実行したいときに、カスタムフレームワークのコアパッケージのエンティティパッケージコアを使用します。だから、あなたはのEntityManagerFactoryのためにリストされている必要なエンティティのすべてのパッケージを持っていることを確認してください:私は(カスタムフレームワークのコアを書き込み)、別の部門の使用entitysでモデルpackagegeを追加するのを忘れ、私の場合は

<bean id="customEntityManagerFactory" parent="abstractEntityManagerFactory"> 
     <property name="dataSource" ref="dataSource"/> 


     <!-- Packages of EntityClasses --> 
     <property name="packagesToScan"> 
      <list merge="true"> 
       <value>ch.company.div1.foo.bar.model</value> 
       <value>ch.company.div1.foo.barnicle.model</value> 
       <value>ch.company.div2.we.help.model</value> 
      </list> 
     </property> 

     <property name="jpaProperties"> 
      <props merge="true"> 
       <prop key="eclipselink.target-database">org.eclipse.persistence.platform.database.SQLServerPlatform 
       </prop> 
       <prop key="javax.persistence.transactionType">RESOURCE_LOCAL</prop> 
      </props> 
     </property> 
    </bean> 

当社。あなたは私が持っていた同じ問題を抱えている場合は/

0

わからない:

幸運は、そのエラーが獣だ...例外が同じなので、多分これが役立ちますされ2つの異なるエンティティファクトリを作成しよう。基本的に、この例外は、間違ったEntityManagerFactoryでエンティティをインスタンス化していたときに発生していました。

私のプロジェクトは1つのデータベース接続で正常に動作していましたが、2番目のインスタンスを追加すると、私のエンティティをインスタンス化する場所がわかりませんでした。いくつかのデバッグの後、私の結論は、私のroot-context.xmlからプロパティ "packagesToScan"を削除し、それを "persistenceXmlLocation"に置き換えることでした。

ルートコンテキストを:そのXMLでは、私は、私は他のすべてをスキャンして除外されるために必要なすべてのクラスを記載されているここで「<除外-非公開-クラス>」

は、現在働いている私の完全なXML構成です。 XML

<bean id="dataSource1" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close"> 
    <property name="driverClassName" value="org.postgresql.Driver" /> 
    <property name="url" value="jdbc:postgresql://server1.example.com:5432/db1" /> 
    <property name="username" value="username" /> 
    <property name="password" value="password" /> 
    <property name="defaultAutoCommit" value="false" /> 
    <property name="initialSize" value="5" /> 
    <property name="maxIdle" value="5" /> 
    <property name="validationQuery" value="SELECT 1" /> 
    <property name="timeBetweenEvictionRunsMillis" value="600000" /> 
    <property name="poolPreparedStatements" value="true" /> 
    <property name="maxOpenPreparedStatements" value="10" /> 
</bean> 

<bean id="dataSource2" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close"> 
    <property name="driverClassName" value="org.postgresql.Driver" /> 
    <property name="url" value="jdbc:postgresql://server2.example.com:5432/db2" /> 
    <property name="username" value="user" /> 
    <property name="password" value="password" /> 
    <property name="defaultAutoCommit" value="false" /> 
    <property name="initialSize" value="5" /> 
    <property name="maxIdle" value="5" /> 
    <property name="validationQuery" value="SELECT 1" /> 
    <property name="timeBetweenEvictionRunsMillis" value="600000" /> 
    <property name="poolPreparedStatements" value="true" /> 
    <property name="maxOpenPreparedStatements" value="10" /> 
</bean> 


<bean id="emf1" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="dataSource" ref="dataSource1" /> 
    <property name="persistenceXmlLocation" value="classpath:META-INF/persistence1.xml" /> 
    <property name="jpaVendorAdapter"> 
     <bean class="org.springframework.orm.jpa.vendor.EclipseLinkJpaVendorAdapter"> 
      <property name="showSql" value="false" /> 
     </bean> 
    </property> 
    <property name="jpaPropertyMap"> 
     <map> 
      <entry key="eclipselink.weaving" value="false" /> 
      <entry key="eclipselink.logging.level" value="WARNING" /> 
      <entry key="eclipselink.logging.timestamp" value="false" /> 
      <entry key="eclipselink.logging.session" value="false" /> 
      <entry key="eclipselink.logging.thread" value="false" /> 
     </map> 
    </property> 
    <property name="loadTimeWeaver"> 
     <bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver" /> 
    </property> 
</bean> 

<bean id="emf2" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="dataSource" ref="dataSource2" /> 
    <property name="persistenceXmlLocation" value="classpath:META-INF/persistence2.xml" /> 
    <property name="jpaVendorAdapter"> 
     <bean class="org.springframework.orm.jpa.vendor.EclipseLinkJpaVendorAdapter"> 
      <property name="showSql" value="false" /> 
     </bean> 
    </property> 
    <property name="jpaPropertyMap"> 
     <map> 
      <entry key="eclipselink.weaving" value="false" /> 
      <entry key="eclipselink.logging.level" value="WARNING" /> 
      <entry key="eclipselink.logging.timestamp" value="false" /> 
      <entry key="eclipselink.logging.session" value="false" /> 
      <entry key="eclipselink.logging.thread" value="false" /> 
     </map> 
    </property> 
    <property name="loadTimeWeaver"> 
     <bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver" /> 
    </property> 
</bean> 

<bean name="transaction1" class="org.springframework.orm.jpa.JpaTransactionManager" p:entity-manager-factory-ref="emf1" /> 
<bean name="transaction2" class="org.springframework.orm.jpa.JpaTransactionManager" p:entity-manager-factory-ref="emf2" /> 

<jpa:repositories base-package="org.myproject.repository1" transaction-manager-ref="transaction1" entity-manager-factory-ref="emf1" /> 
<jpa:repositories base-package="org.myproject.repository2" transaction-manager-ref="transaction2" entity-manager-factory-ref="emf2" /> 

<tx:annotation-driven /> 

persistence1.xml

<persistence-unit name="persistence1" transaction-type="RESOURCE_LOCAL"> 
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> 
    <class>org.myproject.repository1.Repo1</class> 
    <class>org.myproject.repository1.Repo2</class> 
    <exclude-unlisted-classes>true</exclude-unlisted-classes> 
</persistence-unit> 

persistence2.xml

<persistence-unit name="persistence2" transaction-type="RESOURCE_LOCAL"> 
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> 
    <class>org.myproject.repository2.Repo1</class> 
    <class>org.myproject.repository2.Repo2</class> 
    <exclude-unlisted-classes>true</exclude-unlisted-classes> 
</persistence-unit> 

ので、これは私の作品...どうやら、それぞれ「persistence.xmlの」場所を指定

は、最初の「EMF」でインスタンス化される別のEntityManagerFactoryのために意図されているクラスを防ぐことができます。実際、これはバグhttps://bugs.eclipse.org/bugs/show_bug.cgi?id=338837のように見えます。デバッグからわかることは、 "persistenceXmlLocation"がなければ、 "packageScan"で見つかったすべてのクラスが最初に作成された "emf"でインスタンス化され、2番目の "emf"は完全に無視されたということです。

これが役に立ちます。がんばろう!

0

エンティティを含むパッケージ(com.acme.domain.entities)をpackagesToScanに追加します。代わりに、必要に応じてpersistenceXmlLocation

persistence.xml

0

設定PersistenceUnitName、。

factory.setPersistenceUnitName("dummy1"); 
factory.setPersistenceUnitName("dummy2"); 
関連する問題