报错原因
报错原因是因为在其他的数据源中也添加了 @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);
}
}