I use SpringBoot with Hibernate as a persistence provider. For my application, I needed to dynamically choose between two databases.
(For simplicity sake, domain : localhost:8080 ---> hem1 DB domain : 127.0.0.1:8080 ---> hem2 DB )
Below is the implementation of AbstractRoutingDB
public class MyRoutingDataSource extends AbstractRoutingDataSource{ @Override protected Object determineCurrentLookupKey() { return SessionUtil.getDB(); } }
The following is the database configuration:
package com.hemant.basic.dataSource; import java.beans.PropertyVetoException; import java.util.HashMap; import java.util.Map; import javax.naming.ConfigurationException; import javax.sql.DataSource; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import com.mchange.v2.c3p0.ComboPooledDataSource; @Configuration public class DBConfig { @Bean(name = "dataSource") public DataSource dataSource() throws PropertyVetoException, ConfigurationException { MyRoutingDataSource routingDB = new MyRoutingDataSource(); Map<Object, Object> targetDataSources = datasourceList();
Also, the following parameter is specified in the application.properties settings, so automatic scheme updating is enabled.
Problem: when I run the application, the hbm2ddl schema update is performed only on hem1 (defaultTargetDb), but not in other target databases
The following is part of the startup logs.
[main] org.hibernate.tool.hbm2ddl.SchemaUpdate : HHH000228: Running hbm2ddl schema update [main] org.hibernate.tool.hbm2ddl.SchemaUpdate : HHH000102: Fetching database metadata [main] org.hibernate.tool.hbm2ddl.SchemaUpdate : HHH000396: Updating schema [main] java.sql.DatabaseMetaData : HHH000262: Table not found: users [main] java.sql.DatabaseMetaData : HHH000262: Table not found: users [main] java.sql.DatabaseMetaData : HHH000262: Table not found: users [main] org.hibernate.tool.hbm2ddl.SchemaUpdate : HHH000232: Schema update complete`enter code here`
THIS IS PERFORMED ONLY FOR 1 DB.
** Later, when I execute the URL for the rest, say
GET localhost: 8080 / users - the results are successfully loaded for the updated DB.1.
But when GET 127.0.0.1:8080/users is available, as the schema is not updated / not created, the IT result is SQL Exception **
How can we guarantee that the "hbm2ddl schema update" is performed on all AbstractRoutingDataSource target databases