多个数据源(Spring启动和休眠)

时间:2019-09-13 11:31:50

标签: java hibernate spring-boot multiple-databases

我正在尝试连接到两个数据库(MSSQL和PostgreSQL)。但我收到此错误:

org.springframework.beans.factory.BeanCreationException:在类路径资源[org / infobip / webrtc / admin / config / db / MssqlConfig.class]中创建名称为'entityManagerFactory'的bean时出错。方法失败;嵌套的异常是org.hibernate.service.spi.ServiceException:无法创建请求的服务[org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]

这是我的第一个数据库的配置文件:

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
        entityManagerFactoryRef = "entityManagerFactory",
        basePackages = "org.myorg.something.more.mssql.repo",
        transactionManagerRef = "transactionManager"
)
public class MssqlConfig {

    @Value("${spring.datasource.mssql.url}")
    String url;
    @Value("${spring.datasource.mssql.username}")
    String username;
    @Value("${spring.datasource.mssql.password}")
    String password;
    @Value("${spring.datasource.mssql.driverClassName}")
    String driverClassName;

    @Primary
    @Bean(name = "datasource")
    @ConfigurationProperties(prefix = "spring.datasource.mssql")
    public DataSource dataSource() {
        return DataSourceBuilder.create().url(url).username(username).password(password).driverClassName(driverClassName).build();
    }

    @Primary
    @Bean(name = "entityManagerFactory")
    public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean(EntityManagerFactoryBuilder builder,
                                                                           @Qualifier("datasource") DataSource dataSource) {
        Map<String, Object> properties = new HashMap<>();
        properties.put("hibernate.hbm2ddl..auto", "update");
        properties.put("hibernate.dialect", "org.hibernate.HSQLDialect");
        properties.put("show_sql", "true");
        properties.put("hibernate.connection.driver_class", "com.mysql.cj.jdbc.Driver");
        return builder.dataSource(dataSource).properties(properties).packages("org.infobip.webrtc.admin.mssql.entity").persistenceUnit("AuditLogEntity").build();
    }

    @Primary
    @Bean(name = "transactionManager")
    public PlatformTransactionManager transactionManager(@Qualifier("entityManagerFactory") EntityManagerFactory entityManagerFactory) {
        return new JpaTransactionManager(entityManagerFactory);
    }
}

这是第二个数据库的配置文件:

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
        entityManagerFactoryRef = "domainEntityManagerFactory",
        basePackages = "org.myorg.something.more.postgres.repository",
        transactionManagerRef = "domainTransactionManager"
)
public class PostgreSQLConfig {

    @Value("${spring.datasource.postgres.url}")
    String url;
    @Value("${spring.datasource.postgres.username}")
    String username;
    @Value("${spring.datasource.postgres.password}")
    String password;

    @Bean(name="domainDatasource")
    @ConfigurationProperties(prefix="spring.datasource.postgres")
    public DataSource dataSource() {
        return DataSourceBuilder.create().url(url).password(password).username(username).build();
    }

    @Bean(name="domainEntityManagerFactory")
    public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean(EntityManagerFactoryBuilder builder,
                                                                           @Qualifier("domainDatasource") DataSource dataSource) {
        Map<String, Object> properties = new HashMap<>();
        properties.put("hibernate.hbm2ddl..auto", "update");
        properties.put("hibernate.dialect", "org.hibernate.HSQLDialect");
        properties.put("show_sql", "true");
        return builder.dataSource(dataSource).properties(properties).packages("org.infobip.webrtc.admin.postgres.entity").persistenceUnit("DomainEntity").build();
    }

    @Bean(name="domainTransactionManager")
    public PlatformTransactionManager transactionManager(@Qualifier("domainEntityManagerFactory") EntityManagerFactory entityManagerFactory){
        return new JpaTransactionManager(entityManagerFactory);
    }
}

这是我的pom.xml文件(只是其中的一部分):

 <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <version>42.2.5</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
            <version>5.4.2.Final</version>
        </dependency>

        <dependency>
            <groupId>javax.transaction</groupId>
            <artifactId>javax.transaction-api</artifactId>
            <version>1.2</version>
        </dependency>
        <dependency>
            <groupId>com.microsoft.sqlserver</groupId>
            <artifactId>sqljdbc4</artifactId>
            <version>4.0</version>
        </dependency>

这是第一个数据库的存储库:

public interface AuditLogRepo extends JpaRepository<AuditLogEntity, Long> {
}

这是第二个数据库的存储库:

public interface DomainRepository extends JpaRepository<DomainEntity, Integer> {
}

这是第一个数据库的实体:


@Entity
@Table(name = "domain")
@Builder
@Data
@AllArgsConstructor
@NoArgsConstructor
public class DomainEntity {
    @Id
    @SequenceGenerator(name = "pk_sequence", sequenceName = "domain_id_seq", allocationSize = 1)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "pk_sequence")
    private Integer id;
    private String did;
    private String domain;
    @Column(name = "last_modified")
    private LocalDateTime lastModified;
}

这是第二个数据库的实体:


@Entity
@Data
@AllArgsConstructor
@NoArgsConstructor
@Table(name="auditlog")
@Builder
public class AuditLogEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;
    private String name;
    private int expirationMonth;
    private int expirationYear;
}

这是我的application.yml文件:

spring:
  datasource:
    mssql:
      url: 
      username: 
      password: 
      driverClassName: 
    postgres:
      url: 
      username: 
      password: 
      driverClassName: 
      hikari:
        maximum-pool-size: 1
  jpa:
    show-sql: true
    properties.hibernate.jdbc.lob.non_contextual_creation: true
    database-platform: org.hibernate.dialect.HSQLDialect
    hibernate.ddl-auto: none

有人可以告诉我这是怎么回事吗?

0 个答案:

没有答案