升级Spring Boot3+DbRider1.35.0后遇AmbiguousTableNameException异常
问题解决方案
异常原因分析
AmbiguousTableNameException是DbUnit检测到不同schema下存在同名表时抛出的错误,即便你设置了schema和qualifiedTableNames,但由于Spring Boot 3或DbRider 1.35.0的配置逻辑变化,这些参数未正确生效,导致DbUnit仍扫描到了重复表名。
具体解决步骤
1. 确保数据源默认schema配置正确
修改测试环境的数据源配置(如application-test.yml),强制指定默认schema:
spring: datasource: url: jdbc:mariadb://localhost:3306/your_db?currentSchema=test hikari: schema: test # 若使用Hikari连接池,直接指定schema
这样DbUnit连接数据库时会默认使用test schema,避免跨schema的表名冲突。
2. 调整DbRider注解配置,强化schema绑定
更新测试类的注解,确保qualifiedTableNames和schema参数完全生效,可新增caseSensitiveTableNames参数:
@SpringBootTest(classes = { HibernateTestConfig.class, DaoTest_List_DBUnitConfig.class }) @DBRider(dataSourceBeanName = "dbUnitDataSource") @DBUnit(schema = "test", qualifiedTableNames = true, caseSensitiveTableNames = true) @DataSet(CommonDbDomainUtils.DATA_TEST_FILE) public class XXXTest_List_DBUnit { // 测试方法 }
同时,在XML数据集文件中给表名加上schema前缀,例如将<XXX>改为<test.XXX>,明确指定表所属schema。
3. 配置DbUnit允许重复表名(应急方案)
如果上述方法无效,可通过DbUnit的配置Bean强制允许重复表名(不推荐长期使用,仅用于临时排查):
@Configuration public class DbUnitConfig { @Bean public DatabaseConfigBean dbUnitDatabaseConfig() { DatabaseConfigBean config = new DatabaseConfigBean(); config.setAllowDuplicateTableNames(true); return config; } }
然后在测试类的@DBRider注解中指定该配置Bean:
@DBRider(dataSourceBeanName = "dbUnitDataSource", databaseConfigBeanName = "dbUnitDatabaseConfig")
4. 配置数据仅初始化一次的方法
有两种常用方式实现数据只加载一次:
- 方式一:使用Spring的
@TestInstance
设置测试实例生命周期为PER_CLASS,整个测试类仅初始化一次数据:@TestInstance(TestInstance.Lifecycle.PER_CLASS) @SpringBootTest(classes = { HibernateTestConfig.class, DaoTest_List_DBUnitConfig.class }) @DBRider(dataSourceBeanName = "dbUnitDataSource") @DBUnit(schema = "test", qualifiedTableNames = true) @DataSet(value = CommonDbDomainUtils.DATA_TEST_FILE, cleanBefore = true, cleanAfter = false) public class XXXTest_List_DBUnit { // 所有测试方法共享同一套初始化数据 } - 方式二:DbRider连接缓存+加载策略
启用DbRider的连接缓存,配合CLEAN_INSERT加载策略,确保数据只加载一次:@SpringBootTest(classes = { HibernateTestConfig.class, DaoTest_List_DBUnitConfig.class }) @DBRider(dataSourceBeanName = "dbUnitDataSource") @DBUnit(schema = "test", qualifiedTableNames = true, cacheConnection = true) @DataSet(value = CommonDbDomainUtils.DATA_TEST_FILE, loadStrategy = LoadStrategyEnum.CLEAN_INSERT) public class XXXTest_List_DBUnit { // 测试方法复用同一连接和初始化数据 }
内容的提问来源于stack exchange,提问作者Esteban
相关产品推荐
相关产品推荐

