| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- 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<String, Object> getVendorProperties() {
- return hibernateProperties.determineHibernateProperties(
- jpaProperties.getProperties(),
- new HibernateSettings()
- );
- }
- @Bean("transactionManagerSlave")
- public PlatformTransactionManager transactionManager(EntityManagerFactoryBuilder builder) {
- return new JpaTransactionManager(Objects.requireNonNull(localContainerEntityManagerFactoryBean(builder).getObject()));
- }
- }
|