Thanks Marten for your reply. In our case, the data sources are not known up-front. The JNDI of the various data sources are configured in the database and can be changed if required. Currently we have written a look-up kind of class to create that dao class with the data sources injected manually.
Below is the code snippet.
Code:
@Component
public class GenericDAOLookup {
private Map<String, GenericDAO> genericDAOMap = new HashMap<String, GenericDAO>();
public GenericDAO lookupGenericDAO(String jndi) throws NamingException {
GenericDAO genericDAO;
if(genericDAOMap.containsKey(jndi)) {
genericDAO = genericDAOMap.get(jndi);
} else {
genericDAO = new GenericDAOImpl();
JndiObjectFactoryBean jndiObjectFactoryBean = new JndiObjectFactoryBean();
jndiObjectFactoryBean.setJndiName("java:" + jndi);
jndiObjectFactoryBean.afterPropertiesSet();
HibernateJpaVendorAdapter hibernateJpaVendorAdapter = new HibernateJpaVendorAdapter();
hibernateJpaVendorAdapter.setDatabasePlatform("com.hibernate.dialect.Oracle9iDialect");
hibernateJpaVendorAdapter.setShowSql(true);
hibernateJpaVendorAdapter.setGenerateDdl(false);
LocalContainerEntityManagerFactoryBean entityManagerFactory = new LocalContainerEntityManagerFactoryBean();
entityManagerFactory.setDataSource((DataSource) jndiObjectFactoryBean.getObject());
entityManagerFactory.setPersistenceUnitName("Sample");
entityManagerFactory.setPersistenceXmlLocation("classpath:META-INF/persistence.xml");
entityManagerFactory.setJpaVendorAdapter(hibernateJpaVendorAdapter);
entityManagerFactory.afterPropertiesSet();
((GenericDAOImpl)genericDAO).setEntityManagerFactory(entityManagerFactory.getObject());
genericDAOMap.put(jndi, genericDAO);
}
return genericDAO;
}
}
I am unable to understand the second approach using ContextSwappableTargetSource. Will surely try it out and let you know.