SpringBoot配置多数据源Oracle序列无效
异常信息
Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed;
nested exception is org.mybatis.spring.MyBatisSystemException:
nested exception is org.apache.ibatis.type.TypeException:
Could not set parameters for mapping:
ParameterMapping{property='id', mode=IN, javaType=class java.lang.Long, jdbcType=null, numericScale=null, resultMapId='null', jdbcTypeName='null', expression='null'}.
Cause: org.apache.ibatis.type.TypeException: Error setting null for parameter #1 with JdbcType OTHER .
Try setting a different JdbcType for this parameter or a different jdbcTypeForNull configuration property.
Cause: java.sql.SQLException: Invalid column type: 1111] with root cause
异常原因
SpringBoot 配置多数据源时。全局的序列配置将会失效,各数据源需要单独配置自己的序列信息。
异常代码
@Configuration
@MapperScan(basePackages = {"com.ivali.resource.mapper.rmw"}, sqlSessionFactoryRef = "sqlSessionFactoryRmw")
public class RmwDataSourceConfig {
@Bean(name = "rmwDataSource")
@Qualifier("rmwDataSource")
@ConfigurationProperties(prefix = "spring.datasource.rmw")
public DataSource rmwDataSource() {
return new DruidXADataSource();
}
@Bean(name = "rmwJdbcTemplate")
public JdbcTemplate rmwJdbcTemplate(@Qualifier("rmwDataSource") DataSource dataSource) {
return new JdbcTemplate(dataSource);
}
@Bean(name = "sqlSessionFactoryRmw")
public MybatisSqlSessionFactoryBean sqlSessionFactoryRmw(@Qualifier("rmwDataSource") DataSource dataSource) throws Exception {
MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean();
bean.setDataSource(dataSource);
return bean;
}
@Bean(name = "transactionManagerRmw")
public DataSourceTransactionManager testTransactionManager(@Qualifier("rmwDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean(name = "sqlSessionTemplateRmw")
public SqlSessionTemplate sqlSessionTemplateRmw(@Qualifier("sqlSessionFactoryRmw") SqlSessionFactory sqlSessionFactory) throws Exception {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
修正的代码
为该数据源配置单独的配置
@Configuration
@MapperScan(basePackages = {"com.ivlai.resource.mapper.rmw"}, sqlSessionFactoryRef = "sqlSessionFactoryRmw")
public class RmwDataSourceConfig {
@Bean(name = "rmwDataSource")
@Qualifier("rmwDataSource")
@ConfigurationProperties(prefix = "spring.datasource.rmw")
public DataSource rmwDataSource() {
return new DruidXADataSource();
}
@Bean(name = "rmwJdbcTemplate")
public JdbcTemplate rmwJdbcTemplate(@Qualifier("rmwDataSource") DataSource dataSource) {
return new JdbcTemplate(dataSource);
}
@Bean(name = "sqlSessionFactoryRmw")
public MybatisSqlSessionFactoryBean sqlSessionFactoryRmw(@Qualifier("rmwDataSource") DataSource dataSource) throws Exception {
MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean();
bean.setDataSource(dataSource);
// 改了这里,自定义的config配置
bean.setGlobalConfig(globalConfig());
return bean;
}
@Bean(name = "transactionManagerRmw")
public DataSourceTransactionManager testTransactionManager(@Qualifier("rmwDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean(name = "sqlSessionTemplateRmw")
public SqlSessionTemplate sqlSessionTemplateRmw(@Qualifier("sqlSessionFactoryRmw") SqlSessionFactory sqlSessionFactory) throws Exception {
return new SqlSessionTemplate(sqlSessionFactory);
}
// 加了单独的config配置
@Bean(name = "rmwGlobalConfig")
public GlobalConfig globalConfig() {
GlobalConfig conf = new GlobalConfig();
conf.setDbConfig(new GlobalConfig.DbConfig().setKeyGenerator(new OracleKeyGenerator()));
return conf;
}
}
参考
大佬还有详细分析过程:mybatis-plus使用oracle序列生成器不生效问题