Java 未定义类型为[org.springframework.transaction.PlatformTransactionManager]的合格bean

Java 未定义类型为[org.springframework.transaction.PlatformTransactionManager]的合格bean,java,spring,jpa,eclipselink,spring-data-jpa,Java,Spring,Jpa,Eclipselink,Spring Data Jpa,我使用2个Weblogic数据源;在XML配置中,我有2个持久化单元、2个EntityManagerFactory和2个TransactionManager。档案如下: persistence.xml: <persistence-unit name="modelPersistence" transaction-type="RESOURCE_LOCAL"> <provider>org.eclipse.persistence.jpa.PersistenceProvider&l

我使用2个Weblogic数据源;在XML配置中,我有2个持久化单元、2个EntityManagerFactory和2个TransactionManager。档案如下:

persistence.xml

<persistence-unit name="modelPersistence" transaction-type="RESOURCE_LOCAL">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> 
</persistence-unit>

<persistence-unit name="orderPersistence" transaction-type="RESOURCE_LOCAL">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
</persistence-unit>
<!-- transactionManagers -->
    <tx:annotation-driven transaction-manager="transactionManager" /> 
    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory" />
    </bean> 

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

<!-- entityManagerFactory --> 
    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="dataSourceModel"/>
        <property name="persistenceXmlLocation" value="classpath*:META-INF/persistence.xml" />
        <property name="persistenceUnitName" value="modelPersistence" />
        <property name="jpaProperties">
            <props>
               <prop key="eclipselink.logging.level">FINE</prop>
            </props>
        </property>
        <property name="loadTimeWeaver">
            <bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver"/>
        </property> 
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.EclipseLinkJpaVendorAdapter">
                <property name="databasePlatform" value="org.eclipse.persistence.platform.database.OraclePlatform" />
                <property name="generateDdl" value="true"/>
                <property name="showSql" value="true"/>
            </bean>
        </property>
    </bean>     

<!-- entityManagerFactoryLegacy --> 
        <bean id="entityManagerFactoryLegacy" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="dataSourceOrder"/>
        <property name="persistenceXmlLocation" value="classpath*:META-INF/persistence.xml" />
        <property name="persistenceUnitName" value="orderPersistence" />
        <property name="jpaProperties">
            <props>
               <prop key="eclipselink.logging.level">FINE</prop>
            </props>
        </property>
        <property name="loadTimeWeaver">
            <bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver"/>
        </property>
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.EclipseLinkJpaVendorAdapter">
                <property name="databasePlatform" value="org.eclipse.persistence.platform.database.OraclePlatform" />
                <property name="generateDdl" value="true"/>
                <property name="showSql" value="true"/>
            </bean>
        </property>
    </bean>

<!-- data source 1-->
     <bean id="dataSourceModel" class="org.springframework.jndi.JndiObjectFactoryBean" depends-on="model-datasource-jndi">
        <property name="jndiName" ref="model-datasource-jndi" />
        <property name="resourceRef" value="true" /> 
    </bean> 

<!-- data source 2-->
     <bean id="dataSourceOrder" class="org.springframework.jndi.JndiObjectFactoryBean" depends-on="order-datasource-jndi">
        <property name="jndiName" ref="order-datasource-jndi" />
        <property name="resourceRef" value="true" /> 
    </bean> 

<!-- configure persistenceUnitManager -->
    <bean id="persistenceUnitManager" class="org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager">
      <property name="persistenceXmlLocation" value="classpath*:META-INF/persistence.xml" />
      <property name="dataSources">
        <map>
            <entry key="jdbc/MODEL-DS" value-ref="dataSourceModel"/>
            <entry key="jdbc/ORDER-DS" value-ref="dataSourceOrder"/> 
        </map>
      </property>
    </bean> 
    <jpa:repositories base-package="org.codingpedia.demo.repositories.ModelRepository" entity-manager-factory-ref="entityManagerFactory" transaction-manager-ref="transactionManager"/>
    <jpa:repositories base-package="org.codingpedia.demo.repositories.OrderRepository" entity-manager-factory-ref="entityManagerFactoryLegacy" transaction-manager-ref="transactionManagerLegacy"/>
@Repository ("ModelRepo")
@PersistenceContext(unitName = "modelPersistence")
public interface ModelRepository extends JpaRepository<Model, String> {}
@Repository ("OrderRepo")
@PersistenceContext(unitName = "orderPersistence")
public interface OrderRepository extends JpaRepository<Model, String> {}
您可以使用:

@Transactional("transactionManagerName")
请参阅org.springframework.transaction.annotation.Transactional(@Transactional)annotation javadoc:

/**
 * A qualifier value for the specified transaction.
 * <p>May be used to determine the target transaction manager,
 * matching the qualifier value (or the bean name) of a specific
 * {@link org.springframework.transaction.PlatformTransactionManager}
 * bean definition.
 */
String value() default "";
/**
*指定事务的限定符值。
*可用于确定目标事务管理器,
*匹配特定对象的限定符值(或bean名称)
*{@link org.springframework.transaction.PlatformTransactionManager}
*bean定义。
*/
字符串值()默认为“”;

在您的情况下,应该是:

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

因为那是你豆子的ID


如果您需要多个数据源,我建议您阅读以下内容:

目前,Dali仅支持每个项目一个持久化单元和一个持久化XML文件。JPA项目中可能存在其他配置,但当使用多个持久性单元时,验证和默认处理可能不正确。查看更多信息。

我尝试了该注释,但不幸的是仍然出现了相同的错误。因此,请尝试为所有回购配置事务管理器(看看是否有帮助):您知道任何其他资源吗?@rgrebski伟大的答案对我来说很有用。你知道有没有可能通过注释实现同样的效果吗?@Mjar不幸的是,javax.transaction.transactional没有这样的选项。你使用的是Spring Data JPA,我建议阅读一下文档。看见每个不同的存储库都需要多个
元素,每个元素都与正确的entitymanagerfactory和transaction manager绑定。基本上你现在做的是完全错误的。你需要正确配置spring数据jpa。目前你的配置是错误的,这也是文档告诉你的。这与hibernate无关,只是正确配置SpringDataJPA的问题,它需要知道哪个实体管理器和事务管理器用于哪个存储库。还有2个
元素不起作用,您只能有一个,或者至少只有一个(定义的最后一个)会有用。您必须有另一个存储库元素或
@EnableJpaRepositories
正在使用默认值或试图这样做的地方。可能在
DispatcherServlet
加载的配置中。上面提供了我仅有的2个存储库;找不到上述配置不起作用的任何原因@DeinumIt与存储库无关,它与您的配置有关,您的配置必须包含更多的
元素或
@EnableJpaRepositories
,或者它包含启用这些元素的其他内容。在本例中,您使用的是Spring的ORM JPA抽象。没有人参与冬眠。是的,它在引擎盖下使用hibernate,但是您可以将其更改为任何您想要的。此外,本教程还介绍了如何在Spring JPA中实现两个数据源不要关注hibernate事实(这是不相关的),重要的是它向您展示了(您忽略了)如何为多个
EntityManagerFactory
s和
TransactionManager
s正确配置Spring数据JPA,我对这个概念真的很陌生@M.Deinum I在application-context.xml中添加了2条语句,并使用了该示例,并用hibernate替换了Eclipse链接,仍然不走运。将更新的配置添加到您的问题中。您的配置中必须有其他内容触发事务管理器查找您尚未发布的内容。并添加完整的堆栈跟踪。
<tx:annotation-driven transaction-manager="transactionManager" />
<tx:annotation-driven transaction-manager="transactionManagerLegacy" />