生成的DatabaseConfiguration.java近乎空白,数据库配置如何读取?
JHipster应用数据库配置读取与多数据源配置指南
一、为什么DatabaseConfiguration.java几乎是空的?
JHipster基于Spring Boot的**自动配置(Auto-Configuration)**机制,核心的数据库配置工作都由Spring Boot自动完成:
- Spring Boot会自动扫描
application-dev.yml(或对应环境的配置文件)中的spring.datasource.*、spring.jpa.*配置项。 - 核心自动配置类如
DataSourceAutoConfiguration(负责创建数据源实例)、HibernateJpaAutoConfiguration(负责JPA/Hibernate的初始化)会读取配置并生成DataSource、EntityManagerFactory等关键Bean。 - 你手中的
DatabaseConfiguration.java仅负责开启JPA仓库扫描、审计功能和事务管理,核心数据源配置完全依赖Spring Boot的自动逻辑。
二、新手友好的双数据源配置步骤
下面是适配JHipster/Spring Boot项目的实操流程:
1. 在配置文件中添加双数据源信息
修改application-dev.yml,分别配置主(primary)、从(secondary)数据源的连接信息:
spring: datasource: primary: url: jdbc:mysql://localhost:3306/blog_primary?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=UTC username: root password: your_password driver-class-name: com.mysql.cj.jdbc.Driver secondary: url: jdbc:mysql://localhost:3306/blog_secondary?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=UTC username: root password: your_password driver-class-name: com.mysql.cj.jdbc.Driver jpa: show-sql: true properties: hibernate: format_sql: true
2. 创建主数据源配置类
新建config/PrimaryDataSourceConfig.java,负责主数据源的Bean初始化:
package com.example.myapp.config; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.jdbc.DataSourceBuilder; import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; import org.springframework.orm.jpa.JpaTransactionManager; import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; import org.springframework.transaction.PlatformTransactionManager; import javax.sql.DataSource; import java.util.HashMap; import java.util.Map; @Configuration @EnableJpaRepositories( basePackages = "com.example.myapp.repository.primary", // 主数据源Repository存放路径 entityManagerFactoryRef = "primaryEntityManagerFactory", transactionManagerRef = "primaryTransactionManager" ) public class PrimaryDataSourceConfig { @Primary @Bean(name = "primaryDataSource") @ConfigurationProperties(prefix = "spring.datasource.primary") public DataSource primaryDataSource() { return DataSourceBuilder.create().build(); } @Primary @Bean(name = "primaryEntityManagerFactory") public LocalContainerEntityManagerFactoryBean primaryEntityManagerFactory( EntityManagerFactoryBuilder builder, @Qualifier("primaryDataSource") DataSource dataSource) { Map<String, String> properties = new HashMap<>(); properties.put("hibernate.hbm2ddl.auto", "update"); return builder .dataSource(dataSource) .packages("com.example.myapp.domain.primary") // 主数据源实体类存放路径 .persistenceUnit("primary") .properties(properties) .build(); } @Primary @Bean(name = "primaryTransactionManager") public PlatformTransactionManager primaryTransactionManager( @Qualifier("primaryEntityManagerFactory") LocalContainerEntityManagerFactoryBean primaryEntityManagerFactory) { return new JpaTransactionManager(primaryEntityManagerFactory.getObject()); } }
3. 创建从数据源配置类
新建config/SecondaryDataSourceConfig.java,配置从数据源:
package com.example.myapp.config; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.boot.jdbc.DataSourceBuilder; import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; import org.springframework.orm.jpa.JpaTransactionManager; import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; import org.springframework.transaction.PlatformTransactionManager; import javax.sql.DataSource; import java.util.HashMap; import java.util.Map; @Configuration @EnableJpaRepositories( basePackages = "com.example.myapp.repository.secondary", // 从数据源Repository存放路径 entityManagerFactoryRef = "secondaryEntityManagerFactory", transactionManagerRef = "secondaryTransactionManager" ) public class SecondaryDataSourceConfig { @Bean(name = "secondaryDataSource") @ConfigurationProperties(prefix = "spring.datasource.secondary") public DataSource secondaryDataSource() { return DataSourceBuilder.create().build(); } @Bean(name = "secondaryEntityManagerFactory") public LocalContainerEntityManagerFactoryBean secondaryEntityManagerFactory( EntityManagerFactoryBuilder builder, @Qualifier("secondaryDataSource") DataSource dataSource) { Map<String, String> properties = new HashMap<>(); properties.put("hibernate.hbm2ddl.auto", "update"); return builder .dataSource(dataSource) .packages("com.example.myapp.domain.secondary") // 从数据源实体类存放路径 .persistenceUnit("secondary") .properties(properties) .build(); } @Bean(name = "secondaryTransactionManager") public PlatformTransactionManager secondaryTransactionManager( @Qualifier("secondaryEntityManagerFactory") LocalContainerEntityManagerFactoryBean secondaryEntityManagerFactory) { return new JpaTransactionManager(secondaryEntityManagerFactory.getObject()); } }
4. 调整项目结构
- 在
domain目录下新建primary和secondary子包,分别存放两个数据源对应的实体类。 - 在
repository目录下新建primary和secondary子包,分别存放对应数据源的Repository接口。
5. 关键注意事项
- 主数据源的所有核心Bean必须添加
@Primary注解,避免Spring出现Bean匹配冲突。 - 实体类和Repository必须严格按数据源分目录存放,对应配置类中的扫描路径。
- 若使用其他数据库(如PostgreSQL),仅需修改
driver-class-name和url格式即可。
内容的提问来源于stack exchange,提问作者djsg
相关产品推荐
相关产品推荐

