package com.malk.config.mutilSource; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.autoconfigure.orm.jpa.HibernateProperties; import org.springframework.boot.autoconfigure.orm.jpa.HibernateSettings; import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties; 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.EntityManager; import javax.sql.DataSource; import java.util.Map; import java.util.Objects; /** * 从数据源配置 * - * 主子项目, 在多数据源情况下, 子项目需要匹配主项目目录结构, 且符合命名规范. 配置对应扫描 EnableJpaRepositories / EntityScan 添加子项目路径 */ @ConditionalOnProperty(name = "spel.multiSource", havingValue = "true") @Configuration @EnableTransactionManagement @EnableJpaRepositories( entityManagerFactoryRef = "entityManagerFactorySlave", transactionManagerRef = "transactionManagerSlave", basePackages = {"com.malk.repository.dao.slave", "com.malk.*.repository.dao.slave"} // slave无公共类, 需单独添加 [子项目可以访问到主项目primary] ) public class SlaveConfig { @Autowired @Qualifier("slaveDataSource") private DataSource dataSourceSlave; @Autowired private JpaProperties jpaProperties; @Autowired private HibernateProperties hibernateProperties; @Bean("entityManagerSlave") public EntityManager entityManager(EntityManagerFactoryBuilder builder) { return Objects.requireNonNull(localContainerEntityManagerFactoryBean(builder).getObject()).createEntityManager(); } @Bean("entityManagerFactorySlave") public LocalContainerEntityManagerFactoryBean localContainerEntityManagerFactoryBean(EntityManagerFactoryBuilder builder) { return builder.dataSource(dataSourceSlave) .properties(getVendorProperties()) // 设置实体类所在目录 [slave无公共类, 需单独添加, 如 JpaMapSlave] .packages("com.malk.repository.entity.slave", "com.malk.*.repository.entity.slave") // 持久化单元名称,当存在多个EntityManagerFactory时,需要制定此名称 .persistenceUnit("slavePersistenceUnit") .build(); } private Map getVendorProperties() { return hibernateProperties.determineHibernateProperties( jpaProperties.getProperties(), new HibernateSettings() ); } @Bean("transactionManagerSlave") public PlatformTransactionManager transactionManager(EntityManagerFactoryBuilder builder) { return new JpaTransactionManager(Objects.requireNonNull(localContainerEntityManagerFactoryBean(builder).getObject())); } }