You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

生成的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 22:23:23