springboot2.0.3使用jpa和hibernate的方式配置多數據源(sqlite和mysql)


application.properties配置:

#數據庫配置
mysql.spring.datasource.jdbc-url =jdbc:mysql://127.0.0.1:3306/test
mysql.spring.datasource.username=admin
mysql.spring.datasource.password=123456
mysql.spring.datasource.driver-class-name=com.mysql.jdbc.Driver
#數據庫連接池
mysql.spring.datasource.max-idle=100
mysql.spring.datasource.max-wait=10000
mysql.spring.datasource.min-idle=5
mysql.spring.datasource.initial-size=5

#sqlite數據庫的配置
sqlite.spring.datasource.jdbc-url = jdbc:sqlite:test.db
sqlite.spring.datasource.driver-class-name = org.sqlite.JDBC
sqlite.spring.datasource.username =
sqlite.spring.datasource.password =

#關閉hibernate的自動創建表結構的機制
spring.jpa.hibernate.ddl-auto=none
spring.jpa.show-sql=true

DataSourceConfig:

@Configuration
public 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)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM