6

プロジェクトにデータベース/スキーマ/永続性ユニットをもう1つ追加しようとしていますが、次のエラーが発生します。

No unique bean of type [javax.persistence.EntityManagerFactory] is defined: expected single bean but found 2

私はグーグル/APIを割り当てましたが、なぜ春が私の構成について不平を言っているのかわかりませんでした。

これが私のapplicationContext.xmlの一部です

  <bean id="entityManagerFactory" 
        class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">

        <property name="dataSource" ref="dataSource" />
        <property name="persistenceUnitName" value="transactionManager" />
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                <property name="showSql" value="${show.hibernate.sql}" />
                <property name="generateDdl" value="false" />
                <property name="databasePlatform" value="org.hibernate.dialect.MySQL5Dialect" />
            </bean>
        </property>
    </bean>

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="${database.driver}" />
        <property name="url" ...
        <property name="testOnBorrow" value="true" />
    </bean>

    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory" />
    </bean>

<bean id="entityManagerFactoryREST" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSourceREST" />
    <property name="persistenceUnitName" value="REST" />
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
            <property name="showSql" value="${show.hibernate.sql}" />
            <property name="generateDdl" value="false" />
            <property name="databasePlatform" value="org.hibernate.dialect.MySQL5Dialect" />
        </bean>
    </property>
</bean>

<bean id="dataSourceREST" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="${database.driver}" />
    ...
    <property name="testOnBorrow" value="true" />
</bean>

<bean id="transactionManagerREST" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactoryREST" />
</bean>

<tx:annotation-driven transaction-manager="REST"/>
<tx:annotation-driven transaction-manager="transactionManager"/>


いくつかの質問:

  • 2つのtx:annotation-drivenが必要ですか?
  • 工場でpersistenceUnitNameを指定する必要がありますか?

春のフォーラムに私のdiggのメモをいくつか入れています(LINK

さて、それはそれです...どんな助けも喜ぶでしょう!

4

4 に答える 4

3

Spring では、必要な EntityManagerFactory は 1 つだけです。あなたが探しているのは、チャピター 13.5.1.4 の Spring ドキュメントで説明されています:「Deals with multiple persitence units」

テキストをコピー/貼り付けます:

「13.5.1.4 複数の持続性ユニットの扱い

たとえば、クラスパスのさまざまな JARS に格納された複数の永続ユニットの場所に依存するアプリケーションの場合、Spring は PersistenceUnitManager を提供して中央リポジトリとして機能し、コストがかかる可能性がある永続ユニットの検出プロセスを回避します。デフォルトの実装では、永続ユニット名を介して解析され、後で取得される複数の場所を指定できます。(デフォルトでは、クラスパスで META-INF/persistence.xml ファイルが検索されます。)

<bean id="pum" class="org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager">
  <property name="persistenceXmlLocations">
    <list>
     <value>org/springframework/orm/jpa/domain/persistence-multi.xml</value>
     <value>classpath:/my/package/**/custom-persistence.xml</value>
     <value>classpath*:META-INF/persistence.xml</value>
    </list>
  </property>
  <property name="dataSources">
   <map>
    <entry key="localDataSource" value-ref="local-db"/>
    <entry key="remoteDataSource" value-ref="remote-db"/>
   </map>
  </property>
  <!-- if no datasource is specified, use this one -->
  <property name="defaultDataSource" ref="remoteDataSource"/>
</bean>

<bean id="emf" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
  <property name="persistenceUnitManager" ref="pum"/>
  <property name="persistenceUnitName" value="myCustomUnit"/>
</bean>

デフォルトの実装では、PersistenceUnitInfo インスタンスが JPA プロバイダーに供給される前に、ホストされているすべてのユニットに影響を与えるプロパティを通じて宣言的に、または永続化ユニットの選択を可能にする PersistenceUnitPostProcessor を通じてプログラムによってカスタマイズできます。PersistenceUnitManager が指定されていない場合は、LocalContainerEntityManagerFactoryBean によって作成され、内部で使用されます。"

于 2011-02-15T16:24:14.197 に答える
2

この例外は、EntityManagerFactoryタイプによって自動配線しようとしていることを意味します。@Autowiredコードに注釈はありますか?

また、 を使用する場合は、属性を正​​しく@PersistenceContext設定してください。unitそして(これが適切かどうかはわかりません)-name属性をそれぞれの工場名に設定してみてください。

また、REST トランザクション マネージャーを誤ってコピー アンド ペーストしていないかどうかを確認してください。現在、そのような Bean はありません。REST

于 2009-12-09T20:18:50.047 に答える
0

factory で persistenceUnitName を指定する必要がありますか?

複数の永続ユニットがある場合は、ファクトリが使用する永続ユニットを指定する必要があります。

問題の核心については、SPR-3955を参照してください。要約すると、Spring 3.0M4 より前のバージョンは、複数のトランザクション マネージャーをサポートしていません@Transactional。また、の「unitName」属性を尊重するとは思わ@PersistenceContextないので、それを指定することもできません。

s を明示的に注入EntityManagerFactoryし、AOP を使用して を再度有効にすることでこれを回避した方法の例については、私のサンプル アプリ@Transactionalを参照してください。

于 2011-01-31T20:59:04.380 に答える
0

すべての @PersistenceContext で unitName が指定されていることを確認してください。特定の EMF または PersistenceUnit がデフォルトであることを Spring に伝える方法がわかりません。デフォルトの EMF で primary="true" を指定するとうまくいくと思いましたが、うまくいかないようです

于 2009-12-10T18:50:31.660 に答える