【问题标题】:Properties not used in multiple database setup多数据库设置中未使用的属性
【发布时间】:2019-07-11 18:59:28
【问题描述】:

出于监管和安全原因,我不得不将 Spring boot 应用程序的逻辑拆分为两个工具:一个用于管理有限数量的表,另一个用于“真实”用户应用程序。因此,我在服务器版本 5.7 上有两个 MySQL 数据库实例。用户工具只访问一个包含几十个表的数据库,而管理工具需要访问两个数据库中的实体。

这些工具都基于 JavaFX 和 Spring Boot。由于这种架构设置,我有三个 maven 包:一个用于管理工具和所有与管理相关的实体、服务等,一个用于用户工具和所有相关实体、服务等。仅与此用户工具相关,第三个与两个工具共享的所有实体。

当我运行用户工具时,它会在共享数据库中生成表,并根据其 application.properties 文件中的配置使用休眠改进命名策略。因此,列在适当的地方有一个下划线。

首先,管理工具根本不会使用 spring.jpa.hibernate.ddl-auto 创建任何数据库表,但我必须使用 spring.jpa.generate-ddl。

现在,当我运行管理工具时,我希望它只在管理数据库中创建表,因为这个数据源被注释为@Primary。但它也会在用户数据库中创建混合大小写的列。因此,我有名为例如列用户数据库中的“email_address”和“emailAddress”。

我想知道我的方法是否使用了任何属性?任何想法如何正确地做到这一点?

请查找以下来源..

application.properties:

# Employee database
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.jdbcUrl=jdbc:mysql://127.0.0.1/agiletunesdb?useSSL=false&serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&characterSetResults=utf-8
spring.datasource.username=YYY
spring.datasource.password=XXXXXX

# Account database
security.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
security.datasource.jdbcUrl=jdbc:mysql://127.0.0.1/authenticationdb?useSSL=false&serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&characterSetResults=utf-8
security.datasource.username=YYY
security.datasource.password=XXXXXX

# create db schema, values are none, validate, update, create, and create-drop. 
#spring.jpa.hibernate.ddl-auto=create
spring.jpa.hibernate.ddl-auto=update
#spring.jpa.hibernate.ddl-auto=none
spring.jpa.generate-ddl=true

# Naming strategy
spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy


# The SQL dialect makes Hibernate generate better SQL for the chosen database
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect

数据库配置:

import javax.sql.DataSource;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

@Configuration
public class MultipleDbConfiguration {

    /*
     * Persistence of admin database  
     */
    @Bean(name = "securityDB")
    @Primary
    @ConfigurationProperties(prefix="security.datasource")
    public DataSource securityDataSource() {
        return DataSourceBuilder.create().build();
    }


    /*
     * 
     * Persistence of user database
     */
    @Bean(name = "organizationDB")
    @ConfigurationProperties(prefix="spring.datasource")
    public DataSource organizationDataSource() {
        return DataSourceBuilder.create().build();
    }
}

用户数据库配置

import java.util.HashMap;

import javax.persistence.EntityManagerFactory;
import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.context.annotation.PropertySources;
import org.springframework.core.env.Environment;
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 org.springframework.transaction.annotation.EnableTransactionManagement;

@Configuration
@EnableJpaRepositories(
        entityManagerFactoryRef = "organizationEntityManagerFactory",
        transactionManagerRef = "organizationTransactionManager",
        basePackages = "com.agiletunes.domain.organization"
        )
@EnableTransactionManagement
@PropertySources({ @PropertySource("classpath:application.properties") })
public class OrganizationConfig {

    @Autowired
    private Environment env; // Contains Properties Load by @PropertySources

    @Bean(name = "organizationEntityManagerFactory")
    public LocalContainerEntityManagerFactoryBean organizationEntityManagerFactory(
            EntityManagerFactoryBuilder builder, @Qualifier("organizationDB") DataSource dataSource) {

        HashMap<String, Object> properties = new HashMap<>();
        properties.put("spring.jpa.properties.hibernate.dialect", env.getProperty("spring.jpa.properties.hibernate.dialect"));
        properties.put("spring.jpa.hibernate.ddl-auto", env.getProperty("spring.jpa.hibernate.ddl-auto"));
        properties.put("spring.jpa.hibernate.naming-strategy", env.getProperty("spring.jpa.hibernate.naming-strategy"));


        return builder
                .dataSource(dataSource)
                .packages("com.agiletunes.domain.organization")
                .persistenceUnit("organizationPU")
                .properties(properties)
                .build();
    }

    @Bean(name="organizationTransactionManager")
    public PlatformTransactionManager secondTransactionManager(@Qualifier("organizationEntityManagerFactory")
    EntityManagerFactory organizationEntityManagerFactory) {

        return new JpaTransactionManager(organizationEntityManagerFactory);
    }
}

【问题讨论】:

  • 第一步,至少检查 DEBUG 级别的日志,配置文件和 bean 是否按预期设置...
  • DEBUG 级别到底是什么?如何开启?我应该期待什么?提前谢谢你
  • 我在属性文件中尝试了 debug = true 。我得到了一堆信息,但没有什么能敲响警钟
  • 好的,我设置了“logging.level.org.springframework=DEBUG”,它生成了几百行调试语句。现在,我该寻找什么?

标签: java spring-boot properties configuration ddl


【解决方案1】:

诀窍是使用具有

的配置类
@PropertySources({ @PropertySource("classpath:application.properties") })

注解。然后,在创建 LocalContainerEntityManagerFactoryBean 的方法中,您可以使用

提取和设置 application.properties 文件中定义的值
properties.put("spring.jpa.hibernate.naming.physical-strategy", env.getProperty("spring.jpa.hibernate.naming.physical-strategy"));

【讨论】:

    猜你喜欢
    • 2020-07-07
    • 1970-01-01
    • 2015-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多