2009-12-09 117 views
6

我想补充一个数据库/模式/ persistenceUnit在我的项目,我收到错误:JPA多持久化单元的错误

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


一些问题:

  • 我需要有两个TX:注释驱动
  • 我需要指定persistenceUnitName来在工厂

我把我的Digg的一些注意事项,春季论坛(LINK

那么完蛋了...任何帮助会很高兴!

+0

你的第一个实体管理器的定义是不可见的,这是非常复杂的,)(固定它) – Bozho 2009-12-09 20:21:47

+0

给你@PersistenceContext用法 – Bozho 2009-12-09 20:48:41

回答

2

这异常意味着你正在试图通过类型自动装配EntityManagerFactory。你的代码中有没有@Autowired注释?

ASLO,使用@PersistenceContext时,正确设置unit属性。和(我不知道这是做正确的事) - 尝试name属性设置为你们各自的工厂名称。

此外,检查如果你没有复制粘贴错误的REST事务管理器 - 现在有没有这样的豆REST

+0

没有@Autowired注解在我的来源中,我总是使用:
@ PersistenceContext private EntityManager em; – 2009-12-09 20:38:10

+0

我不明白你的意思:transactionManagerREST – 2009-12-09 20:40:11

+0

- 似乎没有right – Bozho 2009-12-09 20:42:00

0

确保您的所有@PersistenceContext的指定的unitName。我还没有想出如何告诉Spring特定的EMF或PersistenceUnit是默认的。我以为在默认EMF会工作,但不会出现

0

指定一个主=“真”我需要在工厂指定persistenceUnitName来?

如果你有多个持久化单元,你需要指定工厂将使用的。

更多到问题的心脏,看到SPR-3955。总而言之,Spring 3.0M4之前的版本不支持@Transactional的多个事务管理器。我也不相信这荣誉@PersistenceContext了“的unitName”属性,所以你不能指定,要么。

对于我是如何工作解决此通过明确注入EntityManagerFactory S和使用AOP重新启用@Transactional示例,请参见my sample app

3

使用Spring,你需要有一个唯一的EntityManagerFactory。 你所寻找的是春天文档中描述的柱头13.5.1。4:“涉及多个persitence单位”

我复制/粘贴文本:

“13.5.1.4与多个持久化单元

处理对于那些依靠多个持久化单元位置的应用,存储在不同的例如,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内部使用”