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)

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

时间: 2024-10-07 21:57:24

springboot2.0.3使用jpa和hibernate的方式配置多数据源(sqlite和mysql)的相关文章

SpringMVC+Apache Shiro+JPA(hibernate)整合配置

序: 关于标题: 说是教学,实在愧不敢当,但苦与本人文笔有限,实在找不到更合理,谦逊的词语表达,只能先这样定义了. 其实最真实的想法,只是希望这个关键词能让更多的人浏览到这篇文章,也算是对于自己写文章的一个肯定吧.^_^! 关于内容: 再写这系列文章之前,本人和许多人一样都是伸手党,并深深的了解咱伸手党且英文较差的朋友对于新知识的学习及获取中文资料少的痛苦.所以本着"取之于民,共享与民"的原则,记录下实际工作中对SpringMVC+Shiro整合应用的部分心得.本人技术水平有限,仅希望

将 Shiro 作为应用的权限基础 五:SpringMVC+Apache Shiro+JPA(hibernate)整合配置

配置web.xml,applicationContext.xml, spring-mvc.xml,applicationContext-shiro.xml,而且都有详细的说明. Web.xml是web项目最基本的配置文件,看这个配置,可以快速知道web项目使用什么框架,它就像一个面板,切入我们想用的插件. applicationContext.xml是spring的基本配置,主要配置数据源.JPA实体管理器工厂.事务 spring-mvc.xml是SpringMVC的配置, applicatio

IntelliJ IDEA 2017版 spring-boot2.0.2 搭建 JPA springboot DataSource JPA sort排序方法使用方式, 添加关联表的 order by

1.sort可以直接添加在命名格式的字段中 1 List<BomMain> findAllByDeleted(Integer deleted, Sort sort); 2.可以作为pageable的一个参数使用 1 Page<Originals> selectBomSeriesList(Pageable pageable); 向sort传参的方式 1.装入Pageable使用 1 Sort sort = new Sort(Sort.Direction.ASC, "seri

SpringBoot2.0.2 Application调用的三种方式

一.注解 @SpringBootApplication            点开查看源码是由多个注解合成的注解,其中主要的注解有:            @SpringBootConfiguration            @EnableAutoConfiguration            @ComponentScan 三个关键的注解:             @ComponentScan 自动扫描加载进来的包,-----------可以扫描自动加载的bean            @E

springboot2.0入门(八)-- profile启动文件配置

一.不同环境使用不同配置文件 复制多份配置文件,修改不同的端口,在application.yml文件中添加具体启动的配置文件,可以看到不同的启动端口,使用maven的打包命令,将项目打入jar包: <!-- 跳打包test文件报错--> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId>

springboot2.0.2 websocket 广播消息和一对一通信配置初始化

import com.cmd.exchange.common.constants.WebSocketTopicKey; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.messaging.simp.config.MessageBrokerRegistry; impor

springboot学习入门简易版三---springboot2.0启动方式

2.4使用@componentscan方式启动 2.4.1 @EnableAutoConfiguration 默认只扫描当前类 @EnableAutoConfiguration 默认只扫描当前类,如果再新建一个indexcontroller类,将无法被扫描. 新建indexcontroller类: /** * 测试index类 * @author admin * */ @RestController public class IndexController { @RequestMapping("

java web学习总结(二十一) -------------------模拟Servlet3.0使用注解的方式配置Servlet

一.Servlet的传统配置方式 在JavaWeb开发中, 每次编写一个Servlet都需要在web.xml文件中进行配置,如下所示: 1 <servlet> 2 <servlet-name>ActionServlet</servlet-name> 3 <servlet-class>me.gacl.web.controller.ActionServlet</servlet-class> 4 </servlet> 5 6 <ser

JavaWeb学习总结(四十八)——模拟Servlet3.0使用注解的方式配置Servlet

JavaWeb学习总结(四十八)——模拟Servlet3.0使用注解的方式配置Servlet 一.Servlet的传统配置方式 在JavaWeb开发中, 每次编写一个Servlet都需要在web.xml文件中进行配置,如下所示: 1 <servlet> 2 <servlet-name>ActionServlet</servlet-name> 3 <servlet-class>me.gacl.web.controller.ActionServlet</s