6

我正在尝试在我的项目中再添加一个 database/schema/persistenceUnit 并且收到错误消息:

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

我 google/api 分配,但找不到 spring 抱怨我的配置的原因。

这是我的 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"/>


一些问题:

  • 我需要有两个tx:annotation-driven吗?
  • 我需要在工厂中指定persistenceUnitName吗?

我在春季论坛(链接)上放了一些我的 digg 笔记

嗯,就是这样......任何帮助都会很高兴!

4

4 回答 4

3

使用 Spring,您只需要一个 EntityManagerFactory。您正在寻找的内容在第 13.5.1.4 章的 Spring 文档中进行了描述:“处理多个持久性单元”

我复制/粘贴文本:

"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 事务管理器 - 现在没有这样的 beanREST

于 2009-12-09T20:18:50.047 回答
0

我需要在工厂中指定 persistenceUnitName 吗?

如果您有多个持久性单元,则需要指定工厂将使用哪些持久性单元。

更重要的是,请参阅SPR-3955。总而言之,Spring 3.0M4 之前的版本不支持使用@Transactional. 我也不相信它尊重 的“unitName”属性@PersistenceContext,所以你也不能指定它。

有关我如何通过显式注入EntityManagerFactorys 并使用 AOP 重新启用来解决此问题的示例@Transactional,请参阅我的示例应用程序

于 2011-01-31T20:59:04.380 回答
0

确保您的所有 @PersistenceContext 都指定 unitName。我还没有弄清楚如何告诉 Spring 特定的 EMF 或 PersistenceUnit 是默认值。我认为在默认 EMF 上指定 primary="true" 会起作用,但似乎不起作用

于 2009-12-10T18:50:31.660 回答