package com.fzzy.conf; import org.springframework.beans.factory.annotation.Qualifier; 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.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.persistence.EntityManagerFactory; import javax.sql.DataSource; @Configuration @EnableTransactionManagement @EnableJpaRepositories( basePackages = JpaConfigSecondary.REPOSITORY_PACKAGE, entityManagerFactoryRef = "secondaryEntityManagerFactory", transactionManagerRef = "secondaryTransactionManager" ) public class JpaConfigSecondary { static final String REPOSITORY_PACKAGE = "com.fzzy.async.*.repository"; private static final String ENTITY_PACKAGE = "com.fzzy.async.*.entity"; /** * 扫描spring.jpa.secondary * * @return jpa配置信息 */ @Bean(name = "secondaryJpaProperties") @ConfigurationProperties(prefix = "spring.jpa.secondary") public JpaProperties jpaProperties() { return new JpaProperties(); } /** * 获取次库实体管理工厂对象 * * @param secondaryDataSource 注入名为secondaryDataSource的数据源 * @param jpaProperties 注入名为secondaryJpaProperties的jpa配置信息 * @param builder 注入EntityManagerFactoryBuilder * @return 实体管理工厂对象 */ @Bean(name = "secondaryEntityManagerFactory") public LocalContainerEntityManagerFactoryBean entityManagerFactory( @Qualifier("secondaryDataSource") DataSource secondaryDataSource, @Qualifier("secondaryJpaProperties") JpaProperties jpaProperties, EntityManagerFactoryBuilder builder ) { return builder // 设置数据源 .dataSource(secondaryDataSource) // 设置jpa配置 .properties(jpaProperties.getProperties()) // 设置实体包名 .packages(ENTITY_PACKAGE) // 设置持久化单元名,用于@PersistenceContext注解获取EntityManager时指定数据源 .persistenceUnit("secondaryPersistenceUnit").build(); } /** * 获取实体管理对象 * * @param factory 注入名为secondaryEntityManagerFactory的bean * @return 实体管理对象 */ @Bean(name = "secondaryEntityManager") public EntityManager entityManager(@Qualifier("secondaryEntityManagerFactory") EntityManagerFactory factory) { return factory.createEntityManager(); } /** * 获取主库事务管理对象 * * @param factory 注入名为secondaryEntityManagerFactory的bean * @return 事务管理对象 */ @Bean(name = "secondaryTransactionManager") public PlatformTransactionManager transactionManager(@Qualifier("secondaryEntityManagerFactory") EntityManagerFactory factory) { return new JpaTransactionManager(factory); } }