0

ルーティング データ ソースを使用しており、作成操作には @Transactional アノテーションが付けられています。しかし、トランザクションが開始またはコミットされないことに気付きました。以下は、ルーティング データ ソースの構成です。

<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>

org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean で使用しているのと同じデータ ソース。

次のように、展開時に別のデータ ソースをルーティング データ ソースに追加しています。Spring トランザクション管理が機能しません。

@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(); 
    }
}
4

0 に答える 0