samith kumarasingha
samith kumarasingha

Reputation: 294

Multiple database connection issue in Spring project

I'm going to configure two databases connections in one spring project. Created two Data Source beans in following way.

   @Bean(destroyMethod = "close")
        public BoneCPDataSource getDataSource() {

            ....
            ....
            return dataSource;
    }

    @Bean(destroyMethod = "close")
        public BoneCPDataSource getDataSource2() {

         ....
         ....

        return dataSource;
    }

This is the way I created entity managers.

@Bean
@Qualifier("entityManagerFactory")
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
    ...
    em.setDataSource(getDataSource());
    em.setPersistenceUnitName("entityManagerFactory");
    ...

    return em;
}

@Bean
@Qualifier("entityManagerFactory2")
public LocalContainerEntityManagerFactoryBean entityManagerFactory2() {
    ...
    em.setDataSource(getDataSource2());
    em.setPersistenceUnitName("entityManagerFactory2");
    ...

    return em;
}

Then I Auto-wired above entity managers in Repository implementation classes and it works fine for non transactional data.

@PersistenceContext(unitName = "entityManagerFactory2")
@Qualifier(value = "entityManagerFactory2")
private EntityManager entityManager2;

Then created transactional managers in following way.

@Bean
@Primary
public JpaTransactionManager getTransactionManager() {
    JpaTransactionManager transactionManager = new JpaTransactionManager();
    transactionManager.setEntityManagerFactory(entityManagerFactory().getObject());

    return transactionManager;
}

@Bean(name = "transactionManager2")
@Qualifier("transactionManager2")
public JpaTransactionManager getTransactionManager2() {
    JpaTransactionManager transactionManager = new JpaTransactionManager();
    transactionManager.setEntityManagerFactory(entityManagerFactory2().getObject());

    return transactionManager;
}

    return transactionManager;
}

But the issue is, I can't insert or update tables using Bean transactionManager2 because I don't know the correct way to configure it.

But can insert or update using getTransactionManger only issue is can't configure second connection. Got this error.

Caused by: javax.persistence.TransactionRequiredException: no transaction is in progress
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.checkTransactionNeeded(AbstractEntityManagerImpl.java:1171)
    at org.hibernate.jpa.spi.AbstractEntityManagerImpl.flush(AbstractEntityManagerImpl.java:1332)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

Upvotes: 2

Views: 1693

Answers (1)

Vlad Mihalcea
Vlad Mihalcea

Reputation: 153830

When you want to use the second transaction manager, you need to annotate the service methods with:

@Transactional("transactionManager2")
public void insertPost(Post post) { ... }

Upvotes: 5

Related Questions