有个项目须要做SQL Server到MySQL的数据迁移,并且两边的schema也有很多差别,这时候用工具去迁移就很难了,须要写程序去控制每一个字段的变换。因而采用Spring Data JPA来作这件事,自动搞定各类DAO,并且底层的Hibernate也轻松支持SQL Server和MySQL的java
作这个事情的第一步就是配置两个数据源,一个连MySQL,一个连SQL Server。不少须要支持读写分离多数据源的和这个相似,只会更简单,由于只用支持MySQL就能够。下面看代码:mysql
application.yml的内容是:spring
spring: datasource: mssql: type: org.apache.tomcat.jdbc.pool.DataSource driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver url: jdbc:sqlserver://localhost:1433;database=old; username: sa password: password mysql: type: org.apache.tomcat.jdbc.pool.DataSource driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://localhost:3306/new?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&zeroDateTimeBehavior=convertToNull&useSSL=false username: root password: password jpa: show-sql: false
能够看到,很清楚的两个数据源配置,下面来看怎样使用这两个配置sql
import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder; 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.context.annotation.Primary; import org.springframework.orm.jpa.JpaTransactionManager; import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean; import org.springframework.transaction.PlatformTransactionManager; import javax.sql.DataSource; import java.util.Properties; @Configuration public class DataSourceConfiguration { @Bean @Primary @ConfigurationProperties(prefix = "spring.datasource.mssql") public DataSource mssqlDataSource() { return DataSourceBuilder.create().build(); } @Bean @ConfigurationProperties(prefix = "spring.datasource.mysql") public DataSource mysqlDataSource() { return DataSourceBuilder.create().build(); } @Bean(name = "mssqlEntityManagerFactory") @Primary public LocalContainerEntityManagerFactoryBean mssqlEntityManagerFactory( EntityManagerFactoryBuilder builder) { LocalContainerEntityManagerFactoryBean em = builder .dataSource(mssqlDataSource()) .packages(OldBuy.class) .persistenceUnit("mssql") .build(); Properties properties = new Properties(); properties.setProperty("hibernate.physical_naming_strategy", "org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl"); em.setJpaProperties(properties); return em; } @Bean(name = "mysqlEntityManagerFactory") public LocalContainerEntityManagerFactoryBean mysqlEntityManagerFactory( EntityManagerFactoryBuilder builder) { LocalContainerEntityManagerFactoryBean em = builder .dataSource(mysqlDataSource()) .packages(Buy.class) .persistenceUnit("mysql") .build(); Properties properties = new Properties(); properties.setProperty("hibernate.physical_naming_strategy", "org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy"); em.setJpaProperties(properties); return em; } @Bean(name = "mssqlTransactionManager") @Primary PlatformTransactionManager mssqlTransactionManager(EntityManagerFactoryBuilder builder) { return new JpaTransactionManager(mssqlEntityManagerFactory(builder).getObject()); } @Bean(name = "mysqlTransactionManager") @Primary PlatformTransactionManager mysqlTransactionManager(EntityManagerFactoryBuilder builder) { return new JpaTransactionManager(mysqlEntityManagerFactory(builder).getObject()); } }
这里主要分三块:apache
最上面的两个DataSource
类,根据配置文件产生数据源,注意必须一个是Primary的,否则Spring会报错,由于找到了bean的两个实现,默认不知道选哪一个tomcat
中间的两个LocalContainerEntityManagerFactoryBean
则是根据两个数据源产生对应的EntityManager
,这里就能够作些hibernate的特定配置了,好比取名策略、sql方言之类的app
最后两个PlatformTransactionManager
则是根据两个EntityManager
产生对应的事务管理器,这样咱们才能用事务工具
如今万事俱备,只欠东风了,也就是指定咱们哪些Repository
用上面配置好的两套DataSource
、EntityManager
、Transaction Manager
:sqlserver
import org.springframework.context.annotation.Configuration; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; import org.springframework.transaction.annotation.EnableTransactionManagement; @Configuration @EnableTransactionManagement @EnableJpaRepositories( basePackageClasses = MsSQLXXXRepository.class, entityManagerFactoryRef = "mssqlEntityManagerFactory", transactionManagerRef = "mssqlTransactionManager" ) public class MssqlConfiguration { }
import org.springframework.context.annotation.Configuration; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; import org.springframework.transaction.annotation.EnableTransactionManagement; @Configuration @EnableTransactionManagement @EnableJpaRepositories( basePackageClasses = MySQLYYYRepository.class, entityManagerFactoryRef = "mysqlEntityManagerFactory", transactionManagerRef = "mysqlTransactionManager" ) public class MysqlConfiguration { }
上面就是两种Repository
的配置了,很简单。basePackageClasses
指向的那个类,同一个包里面的全部Repository
都会用这个数据源的配置ui