Spring @Transactional not starting with RoutingDataSources

338 views Asked by At

I am using routing data sources, and my create operations are annotated with @Transactional annotations. But i noticed that transaction does not begin or commit. Following is my routing data source configuration.

<bean id="routingDataSource" class="com.test.dataaccess.base.dao.CustomerRoutingDataSource">
    <property name="defaultTargetDataSource" ref="testDataSource" />
     <property name="targetDataSources">
        <map key-type="java.lang.String">
            <entry key="0" value-ref="testDataSource" />
        </map>
    </property>  
</bean>

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

Same data source i am using with my org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.

I am adding another datasources to routing data sources at deployment time as follows. Spring transaction management does not works.

@Component
public class CustomerDataSourcePostProcessor implements ApplicationListener {

    @Autowired 
    DatasourcesDAO datasourcesDAO; 

    @Autowired
    @Qualifier("customerEntityManagerFactory")
    private LocalContainerEntityManagerFactoryBean testContentEntityManagerFactory;

    @Autowired
    @Qualifier("routingDataSource")
    private CustomerRoutingDataSource routingDataSource;

    @Autowired
    @Qualifier("customerTransactionManager")
    private JpaTransactionManager  customerTransactionManager;


    private static final Logger LOGGER = LoggerFactory.getLogger(CustomerDataSourcePostProcessor.class);

    public void onApplicationEvent(ApplicationEvent e) {
        if (e instanceof ContextRefreshedEvent) {
            loadCustomerDBConfigForServer();
        }
    }

    private void loadCustomerDBConfigForServer() {

        Map<Object, Object> databaseConfig = loadCustomerDatabaseConfig();
        routingDataSource.setTargetDataSources(databaseConfig);       
        routingDataSource.afterPropertiesSet(); 

        testContentEntityManagerFactory.setDataSource(routingDataSource);  
        testContentEntityManagerFactory.afterPropertiesSet(); 

        EntityManagerFactory emf  =testContentEntityManagerFactory.getObject(); // transaction not begin possible root cause one 
        customerTransactionManager.setEntityManagerFactory(emf);
        customerTransactionManager.afterPropertiesSet(); 
    }
}
0

There are 0 answers