Springboot 2.1.5 配置JPA多資料來源
阿新 • • 發佈:2019-07-19
最近在學springboot,照著網上部落格想試著配一下Jpa的多資料來源,但發現因為springboot版本太高的問題,網上的demo都不適用,導致找了很久才找到解決辦法。現在把操作過程記錄如下。
一、yml配置
spring: datasource: test1: driver-class-name: com.mysql.jdbc.Driver password: 123456 #url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false #springboot2.0以上 jdbc-url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false username: root test2: driver-class-name: com.mysql.jdbc.Driver password: 123456 #url: jdbc:mysql://localhost:3306/test2?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false #springboot2.0以上 jdbc-url: jdbc:mysql://localhost:3306/test2?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false username: root jpa: ## 是否列印sql show-sql: true properties: hibernate: # 指定引擎為Innodb dialect: org.hibernate.dialect.MySQL5InnoDBDialect hbm2ddl: # create: 每次載入 hibernate 時都會刪除上一次的生成的表, # 然後根據你的 model 類再重新來生成新表,哪怕兩次沒有任何改變也要這樣執行, # 這就是導致資料庫表資料丟失的一個重要原因。 # create-drop :每次載入 hibernate 時根據 model 類生成表,但是 sessionFactory 一關閉,表就自動刪除。 # update:最常用的屬性,第一次載入 hibernate 時根據 model 類會自動建立起表的結構(前提是先建立好資料庫),以後載入 hibernate 時根據 model 類自動更新表結構,即使表結構改變了但表中的行仍然存在不會刪除以前的行。要注意的是當部署到伺服器後,表結構是不會被馬上建立起來的,是要等 應用第一次執行起來後才會。 # validate :每次載入 hibernate 時,驗證建立資料庫表結構,只會和資料庫中的表進行比較,不會建立新表,但是會插入新值。 auto: update
二、註冊datasource到spring容器
@Configuration public class DataSourceConfig { @Bean(name = "primaryDataSource") @Primary @Qualifier("primaryDataSource") @ConfigurationProperties(prefix = "spring.datasource.test1") public DataSource primaryDataSource() { System.out.println("-------------------- primaryDataSource初始化 ---------------------"); return DataSourceBuilder.create().build(); } @Bean(name = "secondaryDataSource") @Qualifier("secondaryDataSource") @ConfigurationProperties(prefix = "spring.datasource.test2") public DataSource secondaryDataSource() { System.out.println("-------------------- secondaryDataSource初始化---------------------"); return DataSourceBuilder.create().build(); } }
三、註冊jpa相關物件進入spring容器
資料來源1:
@Configuration @EnableTransactionManagement @EnableJpaRepositories( entityManagerFactoryRef="entityManagerFactoryPrimary", transactionManagerRef="transactionManagerPrimary", basePackages= { "com.czcstudy.springbootdemo.day1.dao.test1" }) //設定Repository所在位置 public class RepositoryPrimaryConfig { @Autowired @Qualifier("primaryDataSource") private DataSource primaryDataSource; @Autowired private JpaProperties jpaProperties; @Autowired private HibernateProperties hibernateProperties; @Primary @Bean(name = "entityManagerFactoryPrimary") public LocalContainerEntityManagerFactoryBean entityManagerFactoryPrimary( EntityManagerFactoryBuilder builder) { //網上文章大多數都是jpaProperties.getHibernateProperties(dataSource);就直接得到了hibernate的配置map, //但這個方法在springboot2.0+好像就捨棄了,所以這裡改成這樣。 Map<String, Object> properties = hibernateProperties.determineHibernateProperties( jpaProperties.getProperties(), new HibernateSettings()); return builder.dataSource(primaryDataSource).properties(properties) .packages("com.czcstudy.springbootdemo.day1.bean.po").build();//實體包路徑 } @Primary @Bean(name = "transactionManagerPrimary") public PlatformTransactionManager transactionManagerPrimary(EntityManagerFactoryBuilder builder) { return new JpaTransactionManager(entityManagerFactoryPrimary(builder).getObject()); }
資料來源2:
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
entityManagerFactoryRef="entityManagerFactorySecondary",
transactionManagerRef="transactionManagerSecondary",
basePackages= { "com.czcstudy.springbootdemo.day1.dao.test2" }) //設定Repository所在位置
public class RepositorySecondaryConfig {
@Autowired
@Qualifier("secondaryDataSource")
private DataSource secondaryDataSource;
@Autowired
private JpaProperties jpaProperties;
@Autowired
private HibernateProperties hibernateProperties;
@Bean(name = "entityManagerFactorySecondary")
public LocalContainerEntityManagerFactoryBean entityManagerFactorySecondary(
EntityManagerFactoryBuilder builder) {
//網上文章大多數都是jpaProperties.getHibernateProperties(dataSource);就直接得到了hibernate的配置map,
//但這個方法在springboot2.0+好像就捨棄了,所以這裡改成這樣。
Map<String, Object> properties = hibernateProperties.determineHibernateProperties(
jpaProperties.getProperties(), new HibernateSettings());
return builder.dataSource(secondaryDataSource).properties(properties)
.packages("com.czcstudy.springbootdemo.day1.bean.po").build();//實體的包路徑
}
@Bean(name = "transactionManagerSecondary")
public PlatformTransactionManager transactionManagerPrimary(EntityManagerFactoryBuilder builder) {
return new JpaTransactionManager(entityManagerFactorySecondary(builder).getObject());
}
}
四、使用spring事務例
@Service
public class JpaTestServiceImpl implements JpaTestService {
@Autowired
private UserJpaTest2Dao userRepository2;
@Override
@Transactional(value = "transactionManagerSecondary",rollbackFor = RuntimeException.class)
public void test(){
List<UserJpaTest> userJpaTestList = userRepository2.findAll();
System.out.println(userJpaTestList);
}
}
其中指定的value就是前面註冊的PlatformTransactionManager物件名稱,多資料來源時需要指定。
五、小結
以上就是springboot2.1.5 配置jpa多資料來源的方法,啟動專案我們可以看到
HikariPool資料來源已經啟動了,這是springboot的預設資料庫連線池,所以連線池我們這裡