springboot -- 使用jpa和hibernate的方式配置多数据源 ( sqlite 和 mysql )

x33g5p2x  于2021-12-24 转载在 其他  
字(5.2k)|赞(0)|评价(0)|浏览(569)

原文地址:http://www.cnblogs.com/niuzhifa/p/9279543.html

pom.xml配置

  1. <!--mysql依赖-->
  2. <dependency>
  3. <groupId>mysql</groupId>
  4. <artifactId>mysql-connector-java</artifactId>
  5. </dependency>
  6. <dependency>
  7. <groupId>org.springframework.boot</groupId>
  8. <artifactId>spring-boot-starter-data-jpa</artifactId>
  9. </dependency>
  10. <!--sqllite依赖-->
  11. <!--...-->

application.properties配置

  1. #数据库配置
  2. mysql.spring.datasource.jdbc-url =jdbc:mysql://127.0.0.1:3306/test
  3. mysql.spring.datasource.username=admin
  4. mysql.spring.datasource.password=123456
  5. mysql.spring.datasource.driver-class-name=com.mysql.jdbc.Driver
  6. #数据库连接池
  7. mysql.spring.datasource.max-idle=100
  8. mysql.spring.datasource.max-wait=10000
  9. mysql.spring.datasource.min-idle=5
  10. mysql.spring.datasource.initial-size=5
  11. #sqlite数据库的配置
  12. sqlite.spring.datasource.jdbc-url = jdbc:sqlite:test.db
  13. sqlite.spring.datasource.driver-class-name = org.sqlite.JDBC
  14. sqlite.spring.datasource.username =
  15. sqlite.spring.datasource.password =
  16. #关闭hibernate的自动创建表结构的机制
  17. spring.jpa.hibernate.ddl-auto=none
  18. spring.jpa.show-sql=true

DataSourceConfig配置

  1. @Configuration
  2. public class DataSourceConfig {
  3. @Bean(name = "sqliteDataSource")
  4. @ConfigurationProperties(prefix = "sqlite.spring.datasource")
  5. public DataSource sqliteDataSource(){
  6. return DataSourceBuilder.create().build();
  7. }
  8. @Primary //配置该数据源为主数据源
  9. @Bean(name = "mysqlDataSource")
  10. @ConfigurationProperties(prefix = "mysql.spring.datasource")
  11. public DataSource mysqlDataSource(){
  12. return DataSourceBuilder.create().build();
  13. }
  14. }

MysqlDataSourceConfig配置

  1. @Configuration
  2. @EnableTransactionManagement
  3. @EnableJpaRepositories(
  4. entityManagerFactoryRef = "entityManagerFactoryMysql", //EntityManagerFactory引用
  5. transactionManagerRef = "transactionManagerMysql", //transactionManager引用
  6. basePackages = {"com.xxx.mysql"})
  7. public class MysqlDataSourceConfig {
  8. /**
  9. * 注入 mysql数据源
  10. */
  11. @Resource(name = "mysqlDataSource")
  12. private DataSource mysqlDataSource;
  13. /**
  14. * 注入JPA配置实体
  15. */
  16. @Autowired
  17. private JpaProperties jpaProperties;
  18. /**
  19. * 这里其实不需要配置数据库的方言.
  20. * 像hibernate.hbm2ddl.auto 可以在这里配置.但是我的是在application.properties中配置的.
  21. */
  22. private Map<String, Object> getVendorProperties() {
  23. HibernateSettings hibernateSettings = new HibernateSettings();
  24. return jpaProperties.getHibernateProperties(hibernateSettings);
  25. }
  26. /**
  27. * 配置EntityManagerFactory实体
  28. * @param builder
  29. * @return 实体管理工厂
  30. * packages 扫描@Entity注释的软件包名称
  31. * persistenceUnit 持久性单元的名称。 如果只建立一个EntityManagerFactory,可以省略,
  32. 但是如果在同一个应用程序中有多个,应该给它们不同的名字
  33. * properties 标准JPA或供应商特定配置的通用属性。 这些属性覆盖构造函数中提供的任何值。
  34. */
  35. @Primary
  36. @Bean(name = "entityManagerFactoryMysql")
  37. public LocalContainerEntityManagerFactoryBean entityManagerFactoryMysql(
  38. EntityManagerFactoryBuilder builder) {
  39. return builder
  40. .dataSource(mysqlDataSource)
  41. .properties(getVendorProperties())
  42. .packages("com.xxx.mysql")
  43. .persistenceUnit("mysqlPersistenceUnit")
  44. .build();
  45. }
  46. /**
  47. * 配置EntityManager实体
  48. * @param builder
  49. * @return 实体管理器
  50. */
  51. @Primary
  52. @Bean(name = "entityManagerMysql")
  53. public EntityManager entityManager(EntityManagerFactoryBuilder builder) {
  54. return entityManagerFactoryMysql(builder).getObject().createEntityManager();
  55. }
  56. /**
  57. * 配置事务transactionManager
  58. * @param builder
  59. * @return 事务管理器
  60. */
  61. @Primary
  62. @Bean(name="transactionManagerMysql")
  63. public PlatformTransactionManager transactionManagerMysql(
  64. EntityManagerFactoryBuilder builder) {
  65. return new JpaTransactionManager(entityManagerFactoryMysql(builder).getObject());
  66. }
  67. }

SqliteDataSourceConfig配置

  1. @Configuration
  2. @EnableTransactionManagement
  3. @EnableJpaRepositories(
  4. entityManagerFactoryRef="entityManagerFactorySqlite", //EntityManagerFactory引用
  5. transactionManagerRef="transactionManagerSqlite", //transactionManager引用
  6. basePackages={"com.xxx.sqlite"})
  7. public class SqliteDataSourceConfig {
  8. /**
  9. * 注入 sqlite数据源
  10. */
  11. @Resource(name="sqliteDataSource")
  12. private DataSource sqliteDataSource;
  13. /**
  14. * 注入JPA配置实体
  15. */
  16. @Autowired
  17. private JpaProperties jpaProperties;
  18. /**
  19. * 这里其实不需要配置数据库的方言.
  20. */
  21. private Map<String, Object> getVendorProperties() {
  22. HibernateSettings hibernateSettings=new HibernateSettings();
  23. return jpaProperties.getHibernateProperties(hibernateSettings);
  24. }
  25. /**
  26. * 配置EntityManagerFactory实体
  27. * @param builder
  28. * @return 实体管理工厂
  29. * packages 扫描@Entity注释的软件包名称
  30. * persistenceUnit
  31. * properties 标准JPA或供应商特定配置的通用属性。 这些属性覆盖构造函数中提供的任何值。
  32. */
  33. @Bean(name="entityManagerFactorySqlite")
  34. public LocalContainerEntityManagerFactoryBean entityManagerFactorySqlite(
  35. EntityManagerFactoryBuilder builder) {
  36. return builder
  37. .dataSource(sqliteDataSource)
  38. .properties(getVendorProperties())
  39. .packages("com.xxx.sqlite")
  40. .persistenceUnit("sqlitePersistenceUnit")
  41. .build();
  42. }
  43. /**
  44. * 配置EntityManager实体
  45. * @param builder
  46. * @return 实体管理器
  47. */
  48. @Bean(name="entityManagerSqlite")
  49. public EntityManager entityManager(EntityManagerFactoryBuilder builder) {
  50. return entityManagerFactorySqlite(builder).getObject().createEntityManager();
  51. }
  52. /**
  53. * 配置事务transactionManager
  54. * @param builder
  55. * @return 事务管理器
  56. */
  57. @Bean(name="transactionManagerSqlite")
  58. public PlatformTransactionManager transactionManagerSqlite(EntityManagerFactoryBuilder builder) {
  59. return new JpaTransactionManager(entityManagerFactorySqlite(builder).getObject());
  60. }
  61. }

然后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)

相关文章