Spring引导有两个数据源

时间:2017-02-02 12:52:54

标签: java entity-framework spring-boot entitymanager multiple-databases

我试图设置一个带有两个数据源的spring boot项目。

一个用于装载,一个用于存储。

申请道具

# Primary DataSource
datasource.primary.url=url
datasource.primary.username=root
datasource.primary.password=password
datasource.primary.driver-class-name=com.microsoft.sqlserver.jdbc.SQLServerDriver

# Secondary DataSource
datasource.secondary.url=url
datasource.secondary.username=root
datasource.secondary.password=password
datasource.secondary.driver-class-name=com.microsoft.sqlserver.jdbc.SQLServerDriver

主数据库的配置类

    package com.anders.cphbusiness.db;

import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;
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.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import javax.persistence.PersistenceContext;
import javax.sql.DataSource;

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = "com.anders.cphbusiness.entitiesModel", entityManagerFactoryRef = "entityManager")
public class LoadDataSourceConfig {
    @Bean(name = "dataSource")
    @Primary
    @ConfigurationProperties(prefix = "datasource.primary")
    public DataSource loadingDataSource() {
        return DataSourceBuilder.create().build();
    }

    @PersistenceContext(unitName = "primary")
    @Primary
    @Bean(name = "entityManager")
    public LocalContainerEntityManagerFactoryBean loadingEntityManagerFactory(EntityManagerFactoryBuilder builder) {
        return builder.dataSource(loadingDataSource()).persistenceUnit("primary").packages("com.anders.cphbusiness.entitiesModel").build();
    }
}

辅助数据库的配置类

    package com.anders.cphbusiness.db;

import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;
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.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import javax.persistence.PersistenceContext;
import javax.sql.DataSource;

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(basePackages = "com.anders.cphbusiness.storingModel", entityManagerFactoryRef = "secondaryEntityManager", transactionManagerRef = "secondaryTransactionManager")
public class StoreDataSourceConfig {

    @Bean
    @ConfigurationProperties(prefix = "datasource.secondary")
    public DataSource storingDataSource() {
        return DataSourceBuilder.create().build();
    }

    @PersistenceContext(unitName = "secondary")
    @Bean(name = "secondaryEntityManager")
    public LocalContainerEntityManagerFactoryBean storingEntityManagerFactory(
            EntityManagerFactoryBuilder builder) {
        return builder
                .dataSource(storingDataSource())
                .packages("com.anders.cphbusiness.storingModel")
                .persistenceUnit("secondary")
                .build();
    }

    @Bean(name = "secondaryTransactionManager")
    public PlatformTransactionManager transactionManager(EntityManagerFactoryBuilder builder) {
        JpaTransactionManager tm = new JpaTransactionManager();
        tm.setEntityManagerFactory(storingEntityManagerFactory(builder).getObject());
        tm.setDataSource(storingDataSource());
        return tm;
    }
}

我在控制器中的回购抱怨它。

@Autowired
private wagerBoardMarksRepo repo;

实际回购

package com.anders.cphbusiness.repositories;

import com.anders.cphbusiness.entitiesModel.WagerBoard;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;


@Repository
public interface WagerBoardRepo extends JpaRepository<WagerBoard, String> {

}

错误:

     2017-02-02 15:19:53.035  INFO 6804 --- [           main] o.apache.catalina.core.StandardService   : Starting service Tomcat
2017-02-02 15:19:53.035  INFO 6804 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet Engine: Apache Tomcat/8.5.11
2017-02-02 15:19:53.172  INFO 6804 --- [ost-startStop-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2017-02-02 15:19:53.172  INFO 6804 --- [ost-startStop-1] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 3048 ms
2017-02-02 15:19:53.452  INFO 6804 --- [ost-startStop-1] o.s.b.w.servlet.ServletRegistrationBean  : Mapping servlet: 'dispatcherServlet' to [/]
2017-02-02 15:19:53.462  INFO 6804 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'metricsFilter' to: [/*]
2017-02-02 15:19:53.462  INFO 6804 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'characterEncodingFilter' to: [/*]
2017-02-02 15:19:53.462  INFO 6804 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'hiddenHttpMethodFilter' to: [/*]
2017-02-02 15:19:53.462  INFO 6804 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'httpPutFormContentFilter' to: [/*]
2017-02-02 15:19:53.462  INFO 6804 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'requestContextFilter' to: [/*]
2017-02-02 15:19:53.462  INFO 6804 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'webRequestLoggingFilter' to: [/*]
2017-02-02 15:19:53.462  INFO 6804 --- [ost-startStop-1] o.s.b.w.servlet.FilterRegistrationBean   : Mapping filter: 'applicationContextIdFilter' to: [/*]
2017-02-02 15:19:56.837  INFO 6804 --- [           main] j.LocalContainerEntityManagerFactoryBean : Building JPA container EntityManagerFactory for persistence unit 'primary'
2017-02-02 15:19:56.857  INFO 6804 --- [           main] o.hibernate.jpa.internal.util.LogHelper  : HHH000204: Processing PersistenceUnitInfo [
    name: primary
    ...]
2017-02-02 15:19:57.008  INFO 6804 --- [           main] org.hibernate.Version                    : HHH000412: Hibernate Core {5.0.11.Final}
2017-02-02 15:19:57.009  INFO 6804 --- [           main] org.hibernate.cfg.Environment            : HHH000206: hibernate.properties not found
2017-02-02 15:19:57.011  INFO 6804 --- [           main] org.hibernate.cfg.Environment            : HHH000021: Bytecode provider name : javassist
2017-02-02 15:19:57.071  INFO 6804 --- [           main] o.hibernate.annotations.common.Version   : HCANN000001: Hibernate Commons Annotations {5.0.1.Final}
2017-02-02 15:19:57.185  INFO 6804 --- [           main] org.hibernate.dialect.Dialect            : HHH000400: Using dialect: org.hibernate.dialect.SQLServerDialect
2017-02-02 15:19:57.666  WARN 6804 --- [           main] org.hibernate.mapping.RootClass          : HHH000038: Composite-id class does not override equals(): com.anders.cphbusiness.entitiesModel.PK_poolgameTransaction
2017-02-02 15:19:57.667  WARN 6804 --- [           main] org.hibernate.mapping.RootClass          : HHH000039: Composite-id class does not override hashCode(): com.anders.cphbusiness.entitiesModel.PK_poolgameTransaction
2017-02-02 15:19:57.667  WARN 6804 --- [           main] org.hibernate.mapping.RootClass          : HHH000038: Composite-id class does not override equals(): com.anders.cphbusiness.entitiesModel.PK_WagerBoardMarks
2017-02-02 15:19:57.667  WARN 6804 --- [           main] org.hibernate.mapping.RootClass          : HHH000039: Composite-id class does not override hashCode(): com.anders.cphbusiness.entitiesModel.PK_WagerBoardMarks
2017-02-02 15:19:57.668  WARN 6804 --- [           main] org.hibernate.mapping.RootClass          : HHH000038: Composite-id class does not override equals(): com.anders.cphbusiness.entitiesModel.PK_wagerBoard
2017-02-02 15:19:57.668  WARN 6804 --- [           main] org.hibernate.mapping.RootClass          : HHH000039: Composite-id class does not override hashCode(): com.anders.cphbusiness.entitiesModel.PK_wagerBoard
2017-02-02 15:19:58.050  INFO 6804 --- [           main] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'primary'
2017-02-02 15:19:58.090  INFO 6804 --- [           main] j.LocalContainerEntityManagerFactoryBean : Building JPA container EntityManagerFactory for persistence unit 'secondary'
2017-02-02 15:19:58.090  INFO 6804 --- [           main] o.hibernate.jpa.internal.util.LogHelper  : HHH000204: Processing PersistenceUnitInfo [
    name: secondary
    ...]
2017-02-02 15:20:00.790  INFO 6804 --- [           main] org.hibernate.dialect.Dialect            : HHH000400: Using dialect: org.hibernate.dialect.SQLServerDialect
2017-02-02 15:20:00.962  INFO 6804 --- [           main] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'secondary'
2017-02-02 15:20:00.982  WARN 6804 --- [           main] ationConfigEmbeddedWebApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'restController': Unsatisfied dependency expressed through field 'repo'; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.anders.cphbusiness.repositories.wagerBoardMarksRepo' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true), @org.springframework.beans.factory.annotation.Qualifier(value=wagerRepo)}
2017-02-02 15:20:00.982  INFO 6804 --- [           main] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'secondary'
2017-02-02 15:20:00.982  INFO 6804 --- [           main] j.LocalContainerEntityManagerFactoryBean : Closing JPA EntityManagerFactory for persistence unit 'primary'
2017-02-02 15:20:01.002  INFO 6804 --- [           main] utoConfigurationReportLoggingInitializer : 

Error starting ApplicationContext. To display the auto-configuration report re-run your application with 'debug' enabled.
2017-02-02 15:20:01.152 ERROR 6804 --- [           main] o.s.b.d.LoggingFailureAnalysisReporter   : 

***************************
APPLICATION FAILED TO START
***************************

Description:

Field repo in com.anders.cphbusiness.controller.restController required a bean of type 'com.anders.cphbusiness.repositories.wagerBoardMarksRepo' that could not be found.


Action:

Consider defining a bean of type 'com.anders.cphbusiness.repositories.wagerBoardMarksRepo' in your configuration.

尝试按照 http://docs.spring.io/spring-boot/docs/current/reference/html/howto-data-access.html#howto-use-two-entity-managers

中的示例进行操作

任何建议 - 提示 - 使用多个数据源设置弹簧引导的指南(最好使用带有两个数据源的项目的工作git)

0 个答案:

没有答案