標籤:packages ack obj enc tle sed wired 包名 類型
application.properties配置:
#資料庫配置mysql.spring.datasource.jdbc-url =jdbc:mysql://127.0.0.1:3306/testmysql.spring.datasource.username=adminmysql.spring.datasource.password=123456mysql.spring.datasource.driver-class-name=com.mysql.jdbc.Driver#資料庫連接池mysql.spring.datasource.max-idle=100mysql.spring.datasource.max-wait=10000mysql.spring.datasource.min-idle=5mysql.spring.datasource.initial-size=5#sqlite資料庫的配置sqlite.spring.datasource.jdbc-url = jdbc:sqlite:test.dbsqlite.spring.datasource.driver-class-name = org.sqlite.JDBCsqlite.spring.datasource.username =sqlite.spring.datasource.password =#關閉hibernate的自動建立表結構的機制spring.jpa.hibernate.ddl-auto=nonespring.jpa.show-sql=true
DataSourceConfig:
@Configurationpublic class DataSourceConfig { @Bean(name = "sqliteDataSource") @Qualifier(value = "sqliteDataSource") //spring裝配bean的唯一標識 @ConfigurationProperties(prefix = "sqlite.spring.datasource") //application.properties設定檔中該資料來源的配置首碼 public DataSource sqliteDataSource(){ return DataSourceBuilder.create().build(); } @Primary //配置該資料來源為主要資料源 @Bean(name = "mysqlDataSource") @Qualifier(value = "mysqlDataSource") @ConfigurationProperties(prefix = "mysql.spring.datasource") public DataSource mysqlDataSource(){ return DataSourceBuilder.create().build(); }}
MysqlDataSourceConfig
@Configuration@EnableTransactionManagement@EnableJpaRepositories(entityManagerFactoryRef = "entityManagerFactoryMysql", //EntityManagerFactory引用 transactionManagerRef = "transactionManagerMysql", //transactionManager引用 basePackages = {"com.xxx.mysql"})public class MysqlDataSourceConfig { /** * 注入 mysql資料來源 */ @Resource(name = "mysqlDataSource") private DataSource mysqlDataSource; /** * 注入JPA配置實體 */ @Autowired private JpaProperties jpaProperties; /** * 這裡其實不需要設定資料庫的方言. * 像hibernate.hbm2ddl.auto 可以在這裡配置.但是我的是在application.properties中配置的. */ private Map<String, Object> getVendorProperties() { HibernateSettings hibernateSettings = new HibernateSettings(); return jpaProperties.getHibernateProperties(hibernateSettings); } /** * 配置EntityManagerFactory實體 * * @param builder * @return 實體管理工廠 * packages 掃描@Entity注釋的軟體包名稱 * persistenceUnit 持久性單元的名稱。 如果只建立一個EntityManagerFactory,你可以省略這個,但是如果在同一個應用程式中有多個,你應該給它們不同的名字 * properties 標準JPA或供應商特定配置的通用屬性。 這些屬性覆蓋建構函式中提供的任何值。 */ @Primary @Bean(name = "entityManagerFactoryMysql") public LocalContainerEntityManagerFactoryBean entityManagerFactoryMysql(EntityManagerFactoryBuilder builder) { return builder .dataSource(mysqlDataSource) .properties(getVendorProperties()) .packages("com.xxx.mysql") .persistenceUnit("mysqlPersistenceUnit") .build(); } /** * 配置EntityManager實體 * * @param builder * @return 實體管理器 */ @Primary @Bean(name = "entityManagerMysql") public EntityManager entityManager(EntityManagerFactoryBuilder builder) { return entityManagerFactoryMysql(builder).getObject().createEntityManager(); } /** * 配置事務transactionManager * * @param builder * @return 交易管理員 */ @Primary @Bean(name = "transactionManagerMysql") public PlatformTransactionManager transactionManagerMysql(EntityManagerFactoryBuilder builder) { return new JpaTransactionManager(entityManagerFactoryMysql(builder).getObject()); }}
SqliteDataSourceConfig
@Configuration@EnableTransactionManagement@EnableJpaRepositories(entityManagerFactoryRef = "entityManagerFactorySqlite", //EntityManagerFactory引用 transactionManagerRef = "transactionManagerSqlite", //transactionManager引用 basePackages = {"com.xxx.sqlite"})public class SqliteDataSourceConfig { /** * 注入 sqlite資料來源 */ @Resource(name = "sqliteDataSource") private DataSource sqliteDataSource; /** * 注入JPA配置實體 */ @Autowired private JpaProperties jpaProperties; /** * 這裡其實不需要設定資料庫的方言. */ private Map<String, Object> getVendorProperties() { HibernateSettings hibernateSettings = new HibernateSettings(); return jpaProperties.getHibernateProperties(hibernateSettings); } /** * 配置EntityManagerFactory實體 * * @param builder * @return 實體管理工廠 * packages 掃描@Entity注釋的軟體包名稱 * persistenceUnit 持久性單元的名稱。 如果只建立一個EntityManagerFactory,你可以省略這個,但是如果在同一個應用程式中有多個,你應該給它們不同的名字 * properties 標準JPA或供應商特定配置的通用屬性。 這些屬性覆蓋建構函式中提供的任何值。 */ @Bean(name = "entityManagerFactorySqlite") public LocalContainerEntityManagerFactoryBean entityManagerFactorySqlite(EntityManagerFactoryBuilder builder) { return builder .dataSource(sqliteDataSource) .properties(getVendorProperties()) .packages("com.xxx.sqlite") .persistenceUnit("sqlitePersistenceUnit") .build(); } /** * 配置EntityManager實體 * * @param builder * @return 實體管理器 */ @Bean(name = "entityManagerSqlite") public EntityManager entityManager(EntityManagerFactoryBuilder builder) { return entityManagerFactorySqlite(builder).getObject().createEntityManager(); } /** * 配置事務transactionManager * * @param builder * @return 交易管理員 */ @Bean(name = "transactionManagerSqlite") public PlatformTransactionManager transactionManagerSqlite(EntityManagerFactoryBuilder builder) { return new JpaTransactionManager(entityManagerFactorySqlite(builder).getObject()); }}
然後com.xxx.mysql和com.xxx.sqlite目錄下就可以放各自的domain和repository了.跟單資料來源沒有區別.
參考:
https://www.cnblogs.com/sxdcgaq8080/p/7978205.html (springboot-1.5.9)
https://my.oschina.net/chinesedragon/blog/1647846 (springboot-2.0.0)
springboot2.0.3使用jpa和hibernate的方式配置多資料來源(sqlite和mysql)