PrimaryConfig.java 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. package com.malk.config.mutilSource;
  2. import org.springframework.beans.factory.annotation.Autowired;
  3. import org.springframework.beans.factory.annotation.Qualifier;
  4. import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
  5. import org.springframework.boot.autoconfigure.orm.jpa.HibernateProperties;
  6. import org.springframework.boot.autoconfigure.orm.jpa.HibernateSettings;
  7. import org.springframework.boot.autoconfigure.orm.jpa.JpaProperties;
  8. import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
  9. import org.springframework.context.annotation.Bean;
  10. import org.springframework.context.annotation.Configuration;
  11. import org.springframework.context.annotation.Primary;
  12. import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
  13. import org.springframework.orm.jpa.JpaTransactionManager;
  14. import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
  15. import org.springframework.transaction.PlatformTransactionManager;
  16. import org.springframework.transaction.annotation.EnableTransactionManagement;
  17. import javax.persistence.EntityManager;
  18. import javax.sql.DataSource;
  19. import java.util.Map;
  20. import java.util.Objects;
  21. /**
  22. * 主数据源配置,多数据源必须设置一个主数据源, 通过 @Primary 注解 [包含公共部分]
  23. * -
  24. * 主子项目, 在多数据源情况下, 子项目需要匹配主项目目录结构, 且符合命名规范. 配置对应扫描 EnableJpaRepositories / EntityScan 添加子项目路径
  25. */
  26. @ConditionalOnProperty(name = "spel.multiSource", havingValue = "true")
  27. @Configuration
  28. @EnableTransactionManagement
  29. @EnableJpaRepositories(
  30. entityManagerFactoryRef = "entityManagerFactoryPrimary", // 配置连接工厂 entityManagerFactory
  31. transactionManagerRef = "transactionManagerPrimary", // 配置事物管理器 transactionManager
  32. basePackages = {"com.malk.repository.dao.primary", "com.malk.*.repository.dao.primary", "com.malk.base"} // dao层配置主数据 & 公共所在目录 [子项目可以访问到主项目primary]
  33. )
  34. public class PrimaryConfig {
  35. @Autowired
  36. @Qualifier("primaryDataSource") // 指定这是主数据源,为了和从(其他)数据源区别开,因为@Autowired不能导入名称相同的是bean
  37. private DataSource dataSourcePrimary;
  38. @Autowired
  39. private JpaProperties jpaProperties;
  40. @Autowired
  41. private HibernateProperties hibernateProperties;
  42. @Primary
  43. @Bean("entityManagerPrimary")
  44. public EntityManager entityManager(EntityManagerFactoryBuilder builder) {
  45. return Objects.requireNonNull(entityManagerFactoryBean(builder).getObject()).createEntityManager();
  46. }
  47. @Primary
  48. @Bean("entityManagerFactoryPrimary")
  49. public LocalContainerEntityManagerFactoryBean entityManagerFactoryBean(EntityManagerFactoryBuilder builder) {
  50. return builder.dataSource(dataSourcePrimary)
  51. .properties(getVendorProperties())
  52. // 设置实体类所在目录: 包含主数据源与公共 [子项目可以访问到主项目primary]
  53. .packages("com.malk.repository.entity.primary", "com.malk.*.repository.entity.primary", "com.zhuogao.base")
  54. // 持久化单元名称,当存在多个EntityManagerFactory时,需要制定此名称
  55. .persistenceUnit("primaryPersistenceUnit")
  56. .build();
  57. }
  58. private Map<String, Object> getVendorProperties() {
  59. return hibernateProperties.determineHibernateProperties(
  60. jpaProperties.getProperties(),
  61. new HibernateSettings()
  62. );
  63. }
  64. @Primary
  65. @Bean("transactionManagerPrimary")
  66. public PlatformTransactionManager transactionManager(EntityManagerFactoryBuilder builder) {
  67. return new JpaTransactionManager(Objects.requireNonNull(entityManagerFactoryBean(builder).getObject()));
  68. }
  69. }