如何使用database-rider向含GENERATED ALWAYS列的表插入DataSet?
DBRider插入PostgreSQL GENERATED ALWAYS自增列解决方案
错误原因
报错的根本原因是DBUnit(DBRider底层依赖的数据库测试组件)默认会将dataset中未显式声明的字段赋值为null进行插入,而你的group_id是GENERATED ALWAYS AS IDENTITY类型,PostgreSQL禁止用户手动向该类列插入任何值(包括null),必须由数据库自动生成。
方案1:自定义列过滤规则(无需修改表结构,推荐)
通过DBRider提供的列过滤能力,插入时直接跳过自增标识列,让数据库自动生成值:
- 自定义列过滤实现类:
import org.dbunit.dataset.Column; import org.dbunit.dataset.filter.IColumnFilter; public class IgnoreIdentityColumnFilter implements IColumnFilter { @Override public boolean accept(String tableName, Column column) { // 跳过groups表的group_id列,有多张表的自增列可以在这里扩展规则 return !("groups".equals(tableName) && "group_id".equals(column.getColumnName())); } }
- 在测试类/测试方法上的
@DBUnit注解中指定过滤规则:
import com.github.database.rider.core.api.configuration.DBUnit; import com.github.database.rider.junit5.api.DBRider; import org.junit.jupiter.api.Test; @DBRider @DBUnit(columnFilter = IgnoreIdentityColumnFilter.class) public class GroupTest { // 你的测试逻辑 }
配置完成后重新运行测试,DBUnit插入数据时会忽略group_id列,PostgreSQL会自动生成该列的自增数值。
方案2:调整表Identity生成策略(可选)
如果可以接受修改表结构,将GENERATED ALWAYS改为GENERATED BY DEFAULT:
ALTER TABLE groups ALTER COLUMN group_id SET GENERATED BY DEFAULT;
该模式下如果插入语句没有携带group_id的值、或传入null,PostgreSQL都会自动生成对应值,无需额外配置DBRider也能正常插入。
内容的提问来源于stack exchange,提问作者Jantao
相关产品推荐
相关产品推荐

