当前位置: 首页 > 知识库问答 >
问题:

多个数据库设置中未使用的属性

窦凯定
2023-03-14

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

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

当我运行user工具时,它会在共享数据库中生成表,并根据其application.properties文件中的配置使用hibernate ImprovedNamingStrategy。因此,在适当的情况下,这些列都有下划线。

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

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

我想知道是否有任何属性与我的方法一起使用?有什么好主意吗?

请找到以下一些来源…

# 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);
    }
}

共有1个答案

房光临
2023-03-14

诀窍是使用配置类,这些类将具有

@PropertySources({ @PropertySource("classpath:application.properties") })

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

properties.put("spring.jpa.hibernate.naming.physical-strategy", env.getProperty("spring.jpa.hibernate.naming.physical-strategy"));
 类似资料:
  • ... corda部署节点失败。日志显示: [错误] 2018-10-04T11:16:05,466Z[主] ) ~[?:-无法在目标类 ) ~[?:{} ) ~[?:: null at0_1810(本机方法)~[?: 1.8.HikariCP-2.5.1.jar]at0_181(0_181HikariCP-2.5.1.jar1.8.com.zaxxer.hikari.pool.PoolBase.

  • 问题内容: 我想知道是否可以使用for循环设置多个属性: 目前我有十二个QLineEdit框 LineEdit1,LineEdit2,…,LineEdit12,我希望用更少的代码来做到这一点。我尝试了上述方法,但它没有像我期望的那样遍历LineEdit框。将只对名单的工作? 问题答案: 为此任务,您可以使用:

  • 问题内容: 有人知道如何在hibernate配置中添加另一个数据源,以及如何在自己的DAO中将Spring配置为其自动注入该数据源吗? 这是我的带有一个数据源的代码,可以完美运行,但是我不知道如何添加另一个数据源。我想添加另一个数据源,该数据源是具有与实际数据库不同的表的数据库。 DAO EXAMPLE 问题答案: 我假定你有一组应使用的DAO的和适当的,而其他人应该使用不同的和基于。当然,你需要

  • 问题内容: database.php : 问题是我只能在配置中定义one ,default或stats。我遵循了CodeIgniter文档,并添加了以下内容: 这样,我连接到第二个数据库,但是失去了与第一个数据库的连接。有谁对如何加载两个数据库有任何想法,而不必在所有模型构造函数中执行以下操作? 问候, 佩德罗 问题答案: 除了应用Camacho提到的hack之外,您还可以将database.ph

  • 问题内容: 如何在Zend Framework 2中配置(和使用)多个数据库?目前,我在global.php中有以下内容: 但是我看不到添加第二种方法。 问题答案: 如果查看Zend \ Db \ Adapter \ AdapterServiceFactory,您会看到适配器配置仅指向一个键。这意味着它构建的适配器将始终使用此(唯一)配置密钥。 我建议您创建自己的工厂,如下所示: 在您的主模块(或

  • 问题内容: 我刚接触Spring,我试图创建一个Database Manager页面,该页面显示页面加载时的数据库详细信息,并在用户按下Submit时更新数据库设置。 我遵循了本教程,并在属性文件中设置了数据库设置。 我设法以编程方式更新了属性文件中的数据库设置。当我使用以下代码检索数据库设置时 我设法获得了旧的价值而无法获得新的价值 这是applicationContext.xml文件中的映射