Я сгенерировал уже простой проект jhipster с этими спецификациями :
спецификация
Но я хотел бы знать, как добавить новое соединение ко второй БД (MySQL). Поэтому я хочу использовать как DB ( H2 ( DB по умолчанию ), так и "новый" mySQL )!
Сначала я перешел на application-dev.yml и перешел на следующее:
#PrimaryDB
spring:
datasource:
type: com.zaxxer.hikari.HikariDataSource
url: jdbc:h2:file:./target/h2db/db/********;DB_CLOSE_DELAY=-1
username: **********
password:
#PartnerDB
partner:
datasource:
type: com.zaxxer.hikari.HikariDataSource
url: jdbc:mysql://localhost:******/partner
username: root
password:
driver-class-name: org.mysql.jdbc.Driver
Затем я создал класс для каждого из моих БД (один по умолчанию и другой партнер):
PrimaryDbConfig (база данных по умолчанию H2):
package com.*******.config;
import com.sun.corba.se.spi.orbutil.fsm.Input;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.boot.context.properties.ConfigurationProperties;
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.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import javax.persistence.EntityManagerFactory;
import javax.sql.DataSource;
@Configuration
@EnableTransactionManagement
public class PrimaryDbConfig {
@Bean
@Primary
@ConfigurationProperties("spring.datasource")
public DataSourceProperties defaultDataSourceProperties() {
return new DataSourceProperties();
}
@Bean
@Primary
@ConfigurationProperties("spring.datasource")
public DataSource defaultDataSource() {
return defaultDataSourceProperties().initializeDataSourceBuilder().build();
}
@Bean(name = "entityManagerFactory")
@Primary
public LocalContainerEntityManagerFactoryBean defaultEntityManagerFactory(
EntityManagerFactoryBuilder builder) {
return builder
.dataSource(defaultDataSource())
.packages(Input.class)
.persistenceUnit("default")
.build();
}
@Bean(name = "transactionManager")
@Primary
public JpaTransactionManager db2TransactionManager(@Qualifier("entityManagerFactory") final EntityManagerFactory emf) {
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(emf);
return transactionManager;
}
}
PartnerDbConfig (новая БД mySQL):
import com.*****.domain.******;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.boot.context.properties.ConfigurationProperties;
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.annotation.EnableTransactionManagement;
import javax.persistence.EntityManagerFactory;
import javax.sql.DataSource;
import java.util.Properties;
@Configuration
@EnableTransactionManagement
@EntityScan(basePackages = "com.*********.domain")
@EnableJpaRepositories(transactionManagerRef = "partnerTransactionManager", entityManagerFactoryRef = "partnerEntityManagerFactory", basePackages = "com.carrental.repository")
public class PartnerDbConfig {
@Bean
@ConfigurationProperties("partner.datasource")
public DataSourceProperties partnerDataSourceProperties() {
return new DataSourceProperties();
}
@Bean
@ConfigurationProperties("partner.datasource")
public DataSource partnerDataSource() {
return partnerDataSourceProperties().initializeDataSourceBuilder().build();
}
@Bean(name = "partnerEntityManagerFactory")
public LocalContainerEntityManagerFactoryBean partnerEntityManagerFactory(
EntityManagerFactoryBuilder builder) {
Properties properties = new Properties();
properties.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQL5InnoDBDialect");
LocalContainerEntityManagerFactoryBean emf = builder
.dataSource(partnerDataSource())
.packages(*****.class)
.persistenceUnit("******")
.build();
emf.setJpaProperties(properties);
return emf;
}
@Bean(name = "partnerTransactionManager")
public JpaTransactionManager db2TransactionManager(@Qualifier("partnerEntityManagerFactory") final EntityManagerFactory emf) {
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(emf);
return transactionManager;
}
}
Наконец, я создаю другой класс для исключения автоконфигурации :
package com.******.config;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration;
import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;
import org.springframework.transaction.annotation.EnableTransactionManagement;
@SpringBootApplication(
scanBasePackages = {"com.********"},
exclude = { DataSourceAutoConfiguration.class,
HibernateJpaAutoConfiguration.class,
DataSourceTransactionManagerAutoConfiguration.class})
@EnableTransactionManagement
public class SpringbootMultipleDatasourcesApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootMultipleDatasourcesApplication.class, args);
}
}
У меня уже есть соединение с mySQL через IntelliJ IDEA. Но я получаю ошибки, и я не знаю, как иметь два соединения двух разных БД. Я хочу использовать одни и те же сущности и репозиторий для обеих БД. Есть мысли?
3 ошибки:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name '*****EntityManagerFactory' defined in class path resource [com/******/config/PartnerDbConfig.class]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: *******] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.cache.NoCacheRegionFactoryAvailableException: Second-level cache is used in the application, but property hibernate.cache.region.factory_class is not given; please either disable second level cache or set correct region factory using the hibernate.cache.region.factory_class setting and make sure the second level cache provider (hibernate-infinispan, e.g.) is available on the classpath.
Caused by: javax.persistence.PersistenceException: [PersistenceUnit: *******] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.cache.NoCacheRegionFactoryAvailableException: Second-level cache is used in the application, but property hibernate.cache.region.factory_class is not given; please either disable second level cache or set correct region factory using the hibernate.cache.region.factory_class setting and make sure the second level cache provider (hibernate-infinispan, e.g.) is available on the classpath.
Caused by: org.hibernate.cache.NoCacheRegionFactoryAvailableException: Second-level cache is used in the application, but property hibernate.cache.region.factory_class is not given; please either disable second level cache or set correct region factory using the hibernate.cache.region.factory_class setting and make sure the second level cache provider (hibernate-infinispan, e.g.) is available on the classpath.
Новые ошибки:
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'securityConfiguration' defined in file [C:\Users\Rui Portela Pereira\CarRental\target\classes\com\carrental\config\SecurityConfiguration.class]: Unsatisfied dependency expressed through constructor parameter 1;
nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'org.springframework.security.core.userdetails.UserDetailsService' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
Вопросы для резюме:
1.Для настройки моих двух источников данных (URL, имя пользователя, пароль) я должен изменить application-dev.yml, application.yml или h2.server.properties?
2. Затем мне нужно создать два класса для двух моих источников данных (для h2 с первичными аннотациями) и еще один для mysql, верно? Что мне делать с классом «DataBaseConfiguration»?
3. И наконец, мой репозиторий и домен одинаковы для обоих источников данных. Это проблема?
- мой путь:
- com.myapp
- конфигурация
- домен
- Репозиторий