SlaveConfig.java 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  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.data.jpa.repository.config.EnableJpaRepositories;
  12. import org.springframework.orm.jpa.JpaTransactionManager;
  13. import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
  14. import org.springframework.transaction.PlatformTransactionManager;
  15. import org.springframework.transaction.annotation.EnableTransactionManagement;
  16. import javax.persistence.EntityManager;
  17. import javax.sql.DataSource;
  18. import java.util.Map;
  19. import java.util.Objects;
  20. /**
  21. * 从数据源配置
  22. * -
  23. * 主子项目, 在多数据源情况下, 子项目需要匹配主项目目录结构, 且符合命名规范. 配置对应扫描 EnableJpaRepositories / EntityScan 添加子项目路径
  24. */
  25. @ConditionalOnProperty(name = "spel.multiSource", havingValue = "true")
  26. @Configuration
  27. @EnableTransactionManagement
  28. @EnableJpaRepositories(
  29. entityManagerFactoryRef = "entityManagerFactorySlave",
  30. transactionManagerRef = "transactionManagerSlave",
  31. basePackages = {"com.malk.repository.dao.slave", "com.malk.*.repository.dao.slave"} // slave无公共类, 需单独添加 [子项目可以访问到主项目primary]
  32. )
  33. public class SlaveConfig {
  34. @Autowired
  35. @Qualifier("slaveDataSource")
  36. private DataSource dataSourceSlave;
  37. @Autowired
  38. private JpaProperties jpaProperties;
  39. @Autowired
  40. private HibernateProperties hibernateProperties;
  41. @Bean("entityManagerSlave")
  42. public EntityManager entityManager(EntityManagerFactoryBuilder builder) {
  43. return Objects.requireNonNull(localContainerEntityManagerFactoryBean(builder).getObject()).createEntityManager();
  44. }
  45. @Bean("entityManagerFactorySlave")
  46. public LocalContainerEntityManagerFactoryBean localContainerEntityManagerFactoryBean(EntityManagerFactoryBuilder builder) {
  47. return builder.dataSource(dataSourceSlave)
  48. .properties(getVendorProperties())
  49. // 设置实体类所在目录 [slave无公共类, 需单独添加, 如 JpaMapSlave]
  50. .packages("com.malk.repository.entity.slave", "com.malk.*.repository.entity.slave")
  51. // 持久化单元名称,当存在多个EntityManagerFactory时,需要制定此名称
  52. .persistenceUnit("slavePersistenceUnit")
  53. .build();
  54. }
  55. private Map<String, Object> getVendorProperties() {
  56. return hibernateProperties.determineHibernateProperties(
  57. jpaProperties.getProperties(),
  58. new HibernateSettings()
  59. );
  60. }
  61. @Bean("transactionManagerSlave")
  62. public PlatformTransactionManager transactionManager(EntityManagerFactoryBuilder builder) {
  63. return new JpaTransactionManager(Objects.requireNonNull(localContainerEntityManagerFactoryBean(builder).getObject()));
  64. }
  65. }