java - Inject 2 Data sources into spring+hibernate application always throw no transaction is in progress 错误

标签 java mysql spring hibernate jpa

我有 Spring + JPA (Hibernate) 项目,在该项目中我连接到 MsSQL 数据库,现在我需要打开一个新连接,但这次是针对 MySQL>。我正在使用 XML 配置

<bean id="hibernateJpaVendorAdapter"
    class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />

<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"
    destroy-method="close">
    <property name="driverClassName" value="${spring.datasource.driverClassName}" />
   ....
</bean>

<bean id="entityManagerFactory"
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
    p:dataSource-ref="dataSource" p:packagesToScan="com.wsg.admin.api.model"
    p:jpaVendorAdapter-ref="hibernateJpaVendorAdapter">

    <property name="jpaProperties">
        <props>
            <prop key="hibernate.cache.use_second_level_cache">false</prop>
            ....
        </props>
    </property>
    <property name="persistenceUnitName" value="dataSourcePU" />
</bean>

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

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

<!-- Configure the MySQL connection -->
<bean id="enduserDataSource" class="org.apache.commons.dbcp2.BasicDataSource"
    destroy-method="close">
    <property name="driverClassName" value="${enduser.db.driver}" />
    ....
</bean>

<bean id="enduserEntityManagerFactory"
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
    p:dataSource-ref="enduserDataSource" p:packagesToScan="com.wsg.admin.api.model"
    p:jpaVendorAdapter-ref="hibernateJpaVendorAdapter">

    <property name="jpaProperties">
        <props>
            <prop key="hibernate.cache.use_second_level_cache">false</prop>
            ....
        </props>
    </property>
    <property name="persistenceUnitName" value="enduserDataSourcePU" />
</bean>

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

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

然后我尝试使用片段注入(inject) entityManager

@PersistenceContext(unitName="dataSourcePU")
EntityManager entityManager;

@PersistenceContext(unitName="enduserDataSourcePU")
EntityManager endUserEntityManager;

它只适用于第一个数据库,但是当尝试在第二个数据库上坚持时,它会返回错误

javax.persistence.TransactionRequiredException: no transaction is in progress

我尝试用 @Transactional("transactionManager") 注释方法(包含 persist() 调用)一次,并且 @Transactional(value = "enduserTransactionManager") 另一次,第二个 entityManager 总是抛出同样的异常

我试图将 persist() 调用分成不同的方法,并对这两个方法分别进行了注释 @Transactional("transactionManager")@Transactional(value = "enduserTransactionManager") 但还是报同样的错误

@Transactional(value = "enduserTransactionManager")
private void createNewBrandMySQL(Brand newBrand) {

@Transactional("transactionManager")
public Integer createNewBrand(Brand newBrand) throws EntityDoesntExistException { 
//this method calls createNewBrandMySQL

最佳答案

已修复,通过使用 entityManagerFactory 直接注入(inject)一个 em 和另一个

@PersistenceContext(unitName = "dataSourcePU")
EntityManager entityManager;

@Autowired
@Qualifier("enduserEntityManagerFactory")
EntityManagerFactory endUserEntityManagerFactory;

EntityManager endUserEntityManager;

@PostConstruct
public void init() {
    endUserEntityManager = endUserEntityManagerFactory.createEntityManager();
}

关于java - Inject 2 Data sources into spring+hibernate application always throw no transaction is in progress 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47430321/

相关文章:

mysql - 尝试在 MySQL 中定位和批量编辑 WooCommerce 价格

spring - 将自定义 SecurityExpressionOperations 中的方法注册为 Spring SpEL 函数

Java Set 不包含先前放置的元素

java - 使用 JavaFX 将数据写入 MySQL 表

mysql2.so : libmysqlclient_r. so.15:无法打开共享对象文件:没有这样的文件或目录

java - 是否有一种通用方法来验证(基于 xml 的)spring 配置是否有效?

Spring监听器IntrospectorCleanupListener

java - JPA 与 hibernate : Query generated by Hibernate contains duplicate

java - 抽屉菜单未显示在 ViewPager + ActionBar.Listener 中

java - Spring data Mongodb 使用 @Query 处理日期