代码之家  ›  专栏  ›  技术社区  ›  Melad Basilius

将2个数据源注入spring+hibernate应用程序始终抛出无事务正在进行错误

  •  1
  • Melad Basilius  · 技术社区  · 7 年前

    我有一个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>
    

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

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

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

    javax.persistence.TransactionRequiredException: no transaction is in progress
    

    我试着用注释这个方法(其中包含persist()调用) @Transactional("transactionManager") 一次,和 @Transactional(value = "enduserTransactionManager") 另一次,第二个entityManager总是抛出相同的异常

    我试图将persist()调用分离到不同的方法中,并对这两个方法中的每一个都进行了注释 @交易(“transactionManager”) @事务性(value=“enduserTransactionManager”)

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

    @Transactional("transactionManager")
    public Integer createNewBrand(Brand newBrand) throws EntityDoesntExistException { 
    //this method calls createNewBrandMySQL
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   Melad Basilius    7 年前

    固定,通过注入一个 em 直接使用另一个 entityManagerFactory

    @PersistenceContext(unitName = "dataSourcePU")
    EntityManager entityManager;
    
    @Autowired
    @Qualifier("enduserEntityManagerFactory")
    EntityManagerFactory endUserEntityManagerFactory;
    
    EntityManager endUserEntityManager;
    
    @PostConstruct
    public void init() {
        endUserEntityManager = endUserEntityManagerFactory.createEntityManager();
    }