JPA配置多数据源时出现Error creating bean with name ‘entityManagerFactory‘ defined in class path resource

报错原因

报错原因是因为在其他的数据源中也添加了 @Primary 注解,@Primary 表示该数据源为主数据源。

只能有一个主数据源,其他数据源都不要添加 @Primary 注解

如果不是这个原因导致就检查 Bean 名称是否重复


多数据源注入 EntityManager 方式

这些工厂名称和事务管理器名称都可以在下面的数据源配置中找到

// 需要指定实体管理工厂
@PersistenceContext(unitName = "bizEntityManagerFactory")
public EntityManager bizEntityManager;

// 添加事务需要指定事务管理器
@Transactional(value = "bizTransactionManager")

主数据源配置

package com.pro.core.config;

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
import org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy;
import org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy;
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.jdbc.core.JdbcTemplate;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import com.pro.base.repository.GenericJpaRepositoryImpl;

import javax.persistence.EntityManager;
import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map;

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
		entityManagerFactoryRef = "bizEntityManagerFactory",
		transactionManagerRef = "bizTransactionManager",
		basePackages = {// repository包
				"com.pro.catalog.repository"
		},
		repositoryBaseClass = GenericJpaRepositoryImpl.class
)
public class BizDataSourceConfig {

	@Autowired
    private JpaProperties jpaProperties;

	@Value("${mysql.dialect}")
	private String mysqlDialect;


	@Bean(name = "bizDataSource")
	@ConfigurationProperties(prefix = "spring.datasource.druid.biz")
	@Primary
	public DruidDataSource bizDataSource() {
		return DruidDataSourceBuilder.create().build();
	}

	@Primary
    @Bean(name = "bizEntityManagerFactory")
    public LocalContainerEntityManagerFactoryBean entityManagerFactoryBiz(EntityManagerFactoryBuilder builder,
    		@Qualifier("bizDataSource")DataSource bizDataSource) {
        return builder
                .dataSource(bizDataSource)
                .properties(getVendorProperties())
                .packages(
						"com.pro.common.domain",
						"com.pro.catalog.domain"
                ) // 设置实体类所在位置
                .persistenceUnit("bizPersistenceUnit")
                .build();
    }

	@Primary
	@Bean(name = "bizEntityManager")
	public EntityManager entityManager(
			@Qualifier("bizEntityManagerFactory")LocalContainerEntityManagerFactoryBean localContainerEntityManagerFactoryBean) {
		return localContainerEntityManagerFactoryBean.getObject().createEntityManager();
	}


	private Map<String, String> getVendorProperties() {
		Map<String,String> properties = new HashMap<>();
		properties.put("database", "mysql");
        properties.put("hibernate.dialect", mysqlDialect);
        // 设置命名策略, 比如数据库中字段名是: user_name, 则对应实体类中写成 userName
		properties.put("hibernate.physical_naming_strategy", SpringPhysicalNamingStrategy.class.getName());
		properties.put("hibernate.implicit_naming_strategy", SpringImplicitNamingStrategy.class.getName());
        jpaProperties.setProperties(properties);
		return jpaProperties.getProperties();
    }

	@Primary
    @Bean(name = "bizTransactionManager")
    public PlatformTransactionManager transactionManagerBiz(
    		@Qualifier("bizEntityManagerFactory")LocalContainerEntityManagerFactoryBean localContainerEntityManagerFactoryBean) {
        return new JpaTransactionManager(localContainerEntityManagerFactoryBean.getObject());
    }

	@Primary
	@Bean(name = "bizJdbcTemplate")
    public JdbcTemplate bizJdbcTemplate(@Qualifier("bizDataSource")DataSource bizDataSource) {
        return new JdbcTemplate(bizDataSource);
    }
}

其他数据源配置

package com.pro.core.config;

import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
import org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy;
import org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import com.pro.repository.GenericJpaRepositoryImpl;

import javax.persistence.EntityManager;
import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map;

@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
		entityManagerFactoryRef = "bizWebEntityManagerFactory",
		transactionManagerRef = "bizWebTransactionManager",
		basePackages = {// repository包
				"com.pro.dataweb.repository"
		},
		repositoryBaseClass = GenericJpaRepositoryImpl.class
)
public class BizWebDataSourceConfig {

	@Autowired
    private JpaProperties jpaProperties;

	@Value("${mysql.dialect}")
	private String mysqlDialect;


	@Bean(name = "bizWebDataSource")
	@ConfigurationProperties(prefix = "spring.datasource.druid.biz-web")
	public DruidDataSource bizWebDataSource() {
		return DruidDataSourceBuilder.create().build();
	}

    @Bean(name = "bizWebEntityManagerFactory")
    public LocalContainerEntityManagerFactoryBean entityManagerFactoryBizWeb(EntityManagerFactoryBuilder builder,
    		@Qualifier("bizWebDataSource")DataSource bizWebDataSource) {
        return builder
                .dataSource(bizWebDataSource)
                .properties(getVendorProperties())
                .packages(
						"com.pro.common.domain",
						"com.pro.dataweb.domain"
                ) // 设置实体类所在位置
                .persistenceUnit("bizWebPersistenceUnit")
                .build();
    }

	@Bean(name = "bizWebEntityManager")
	public EntityManager entityManager(
			@Qualifier("bizWebEntityManagerFactory")LocalContainerEntityManagerFactoryBean localContainerEntityManagerFactoryBean) {
		return localContainerEntityManagerFactoryBean.getObject().createEntityManager();
	}


	private Map<String, String> getVendorProperties() {
		Map<String,String> properties = new HashMap<>();
		properties.put("database", "mysql");
        properties.put("hibernate.dialect", mysqlDialect);
		// 设置命名策略, 比如数据库中字段名是: user_name, 则对应实体类中写成 userName
		properties.put("hibernate.physical_naming_strategy", SpringPhysicalNamingStrategy.class.getName());
		properties.put("hibernate.implicit_naming_strategy", SpringImplicitNamingStrategy.class.getName());
        jpaProperties.setProperties(properties);
		return jpaProperties.getProperties();
    }

    @Bean(name = "bizWebTransactionManager")
    public PlatformTransactionManager transactionManagerBizWeb(
    		@Qualifier("bizWebEntityManagerFactory")LocalContainerEntityManagerFactoryBean localContainerEntityManagerFactoryBean) {
        return new JpaTransactionManager(localContainerEntityManagerFactoryBean.getObject());
    }

	@Bean(name = "bizWebJdbcTemplate")
    public JdbcTemplate bizWebJdbcTemplate(@Qualifier("bizWebDataSource")DataSource bizWebDataSource) {
        return new JdbcTemplate(bizWebDataSource);
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值