最近在公司在一个已经很臃肿的项目上添加新功能,要求使用的是新数据库,并且使用Spring Data JPA。这让我很懵逼,因为此项目臃肿的程度已经无法想象了,里面有N+个数据源,并且ORM使用到了JDBC、mybatis、Spring Data JPA。如果当时约定使用相同的技术就不会出现问题了(前人种坑,后人填坑....)。
已经有的数据源配置:
1.使用mybatis配置的数据源,且标记了主数据源:(Mybatis数据源配置有多个,我只列标记为@Primary的数据源)
@Configuration
@MapperScan(value = "com.xichuan.flow.mapper.flow", sqlSessionFactoryRef = "sqlSessionFactory")
public class FlowDataSourceConfig {
@Primary
@Bean(name="dataSource")
@ConfigurationProperties(prefix="spring.flow_datasource")
public DataSource flowDataSource() {
return DataSourceBuilder.create().build();
}
@Bean(name = "sqlSessionFactory")
public SqlSessionFactory sqlSessionFactory() throws Exception {
SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(flowDataSource());
return sessionFactory.getObject();
}
}
2.已经有的JPA数据源:
@SuppressWarnings(value = "unused")
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(
basePackages = {
"com.xichuan.imap.repository"
},
entityManagerFactoryRef = "imapEntityManagerFactory",
transactionManagerRef = "imaptransactionManager")
public class ImapDataSourceConfig {
@Autowired
private Environment env;
public ImapDataSourceConfig() {
super();
}
@Bean
public LocalContainerEntityManagerFactoryBean imapEntityManagerFactory() {
final LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
em.setDataSource(imapDataSource());
em.setPackagesToScan(
new String[]{
"com.xichuan.imap.entity"
}
);
final HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
em.setJpaVendorAdapter(vendorAdapter);
return em;
}
@ConfigurationProperties(prefix = "spring.imap_datasource")
public DataSource imapDataSource() {
final DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName(Preconditions.checkNotNull(env.getProperty("spring.imap_datasource.driverClassName")));
dataSource.setUrl(Preconditions.checkNotNull(env.getProperty("spring.imap_datasource.url")));
dataSource.setUsername(Preconditions.checkNotNull(env.getProperty("spring.imap_datasource.username")));
dataSource.setPassword(Preconditions.checkNotNull(env.getProperty("spring.imap_datasource.password")));
final Properties propertiesJpa = new Properties();
dataSource.setConnectionProperties(propertiesJpa);
return dataSource;
}
@Bean
public PlatformTransactionManager imapTransactionManager(EntityManagerFactory emf) {
final JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(emf);
return transactionManager;
}
@Bean
public PersistenceExceptionTranslationPostProcessor exceptionTranslation() {
return new PersistenceExceptionTranslationPostProcessor();
}
}
3.代码中使用到的EntityManager:
@Service
public class ImapServiceImpl{
@Autowired
private EntityManager mEntityManager;
@PostConstruct
public void initFactory() {
logger.info("开始实例化JPAQueryFactory");
mQueryFactory = new JPAQueryFactory(mEntityManager);
}
...
...
}
乍一看并没有什么问题,对,我感觉没有问题,后来发现问题贼多..................
4.配置新代码的JPA数据源:
@Configuration
@EnableJpaRep