В целях безопасности и нормативных требований мне пришлось разделить логику моего загрузочного приложения Spring на два инструмента: один для администрирования с ограниченным числом таблиц и один для «реального» пользовательского приложения.Поэтому у меня есть два экземпляра баз данных MySQL на сервере версии 5.7.Хотя пользовательский инструмент имеет доступ только к одной базе данных с десятками таблиц, инструмент администратора должен иметь доступ к сущностям в обеих базах данных.
Инструменты основаны как на JavaFX, так и на основе Spring Boot.Из-за этой архитектурной настройки у меня есть три пакета maven: один для инструмента администратора и всех связанных с администратором объектов, сервисов и т. Д., Один для пользовательского инструмента и всех связанных объектов, сервисов и т. Д., Относящихся только к этому пользовательскому инструменту, и третийсо всеми сущностями, которые совместно используются обоими инструментами.
Когда я запускаю инструмент пользователя, он генерирует таблицы в общей базе данных и использует hibernate ImprovedNamingStrategy на основе конфигурации в своем файле 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);
}
}