Spring @Transactional annotation with a transaction across multiple data source

ia2d9nvy  于 2023-03-22  发布在  Spring
关注(0)|答案(1)|浏览(151)

我已经成功地与2个数据库建立了连接,并且我能够从第一个数据库连接中选择,插入,更新和删除,但是在使用第二个数据库时,我能够获取数据,但我无法更新或保存数据库中的任何数据。
这是我的jpaContext.xml
第一个数据库连接的配置

<bean name="ds" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="${mdmDriverClassName}" />
    <property name="url" value="${url}" />
    <property name="username" value="${username}" />
    <property name="password" value="${password}" />
</bean>

<bean
    class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"
    name="factory">
    <property name="dataSource" ref="ds" />
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQL57Dialect</prop>
            <prop key="hibernate.hbm2ddl.auto">none</prop>
            <prop key="hibernate.show_sql">false</prop>
        </props>
    </property>
   
    <property name="packagesToScan">
        <list>
            <value>com.bmp.mdm_v1.entites</value>
        </list>
    </property>
</bean>

<bean name="hibernateTemplate" class="org.springframework.orm.hibernate5.HibernateTemplate">
    <property name="sessionFactory" ref="factory" />
    <property name="checkWriteOperations" value="false"></property>
</bean>

<bean name="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
    <property name="sessionFactory" ref="factory" />
</bean>

第二个数据库的配置

<bean name="mdmDs" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="${driverClassName}" />
    <property name="url" value="${mdmDbUrl}" />
    <property name="username" value="${mdmDbUsr}" />
    <property name="password" value="${mdmDbPass}" />
</bean>                        

<bean
    class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"
    name="mdmFactory">
    <property name="dataSource" ref="mdmDs" />
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQL57Dialect</prop>
            <prop key="hibernate.hbm2ddl.auto">none</prop>
            <prop key="hibernate.show_sql">false</prop>
        </props>
    </property>
   
    <property name="packagesToScan">
        <list>
            <value>com.bmp.stamp_biller.entites</value>
        </list>
    </property>
</bean>
                   
<bean name="mdmTmp" class="org.springframework.orm.hibernate5.HibernateTemplate">
    <property name="sessionFactory" ref="mdmFactory" />
    <property name="checkWriteOperations" value="false"></property>
</bean>

<bean name="mdmTxnMang" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
    <property name="sessionFactory" ref="mdmFactory" />
</bean>

这是我的dao实现

@Transactional
public void saveClientBiller(client_biller client_biller) {
    try {
        this.mdmTmp.saveOrUpdate(client_biller);
    } catch (Exception e) {
        System.out.println("Exception- " + e);
    }
}

数据存储在数据库中,但在将数据保存在第二个数据库中后,我收到此错误
数据访问权限无效应用程序使用异常:没有正在进行的交易;嵌套异常为javax.persistence.TransactionRequiredException:没有正在进行的事务
我得到的解决方案,把@Transactional(值=“mdmTxnMang”),但当我这样做时,它会显示错误,如字符串不能转换为txType。

pcww981p

pcww981p1#

确保你的进口是

import org.springframework.transaction.annotation.Transactional;

下一步:尝试创建两个不同的TransactionManagers。将其中一个设置为transaction的属性。

@Transactional(transactionManager = MyFirstTM.class)

相关问题