Java 未定义类型为[org.springframework.transaction.PlatformTransactionManager]的合格bean
我使用2个Weblogic数据源;在XML配置中,我有2个持久化单元、2个EntityManagerFactory和2个TransactionManager。档案如下: persistence.xml: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
<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" />