Reputation: 294
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
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