alibaba/spring-ai-alibaba · error · RuntimeException

Failed to create experiment

Error message

Failed to create experiment

What it means

Thrown by ExperimentServiceImpl.create when experimentMapper.insert(experimentDO) returns <= 0 rows affected, meaning the experiment row was not written to the database. It signals a failed persistence step during experiment creation.

Source

Thrown at spring-ai-alibaba-admin/spring-ai-alibaba-admin-server-start/src/main/java/com/alibaba/cloud/ai/studio/admin/service/impl/ExperimentServiceImpl.java:88

        // 构建实验实体
        ExperimentDO experimentDO = ExperimentDO.builder()
                .name(request.getName())
                .description(request.getDescription())
                .datasetId(request.getDatasetId())
                .datasetVersionId(request.getDatasetVersionId())
                .datasetVersion(request.getDatasetVersion())
                .evaluationObjectConfig(request.getEvaluationObjectConfig())
                .evaluatorConfig(request.getEvaluatorConfig())
                .status(String.valueOf(ExperimentStatus.RUNNING))
                .progress(0)
                .createTime(LocalDateTime.now())
                .updateTime(LocalDateTime.now())
                .build();

        // 插入数据库
        int result = experimentMapper.insert(experimentDO);
        if (result <= 0) {
            throw new RuntimeException("Failed to create experiment");
        }

        log.info("实验创建成功: {}", experimentDO.getId());
        
        // 异步启动实验执行
        startExperimentExecution(experimentDO);
        
        return Experiment.fromDO(experimentDO);
    }

    @Override
    public PageResult<Experiment> list(ExperimentListRequest request) {
        log.info("查询实验列表: {}", request);


        ExperimentStatus status = null;
        if (StringUtils.hasText(request.getStatus())) {
            try {

View on GitHub (pinned to f82da0b50f)

Solutions

  1. Check application logs for the underlying SQL exception around the insert
  2. Validate referenced entities (dataset, model, evaluator) exist before insert
  3. Run database migrations so the schema matches the current code
  4. Throw a typed ExperimentCreateException and map DB constraint errors to 4xx responses

Example fix

// before
int result = experimentMapper.insert(experimentDO);
if (result <= 0) {
    throw new RuntimeException("Failed to create experiment");
}
// after
int result = experimentMapper.insert(experimentDO);
if (result <= 0) {
    throw new ExperimentCreationException("Experiment insert affected 0 rows"); // -> 500 with context
}
Defensive patterns

Strategy: try-catch

Validate before calling

if (request.getDatasetId() != null && datasetService.getById(request.getDatasetId()) == null) throw new IllegalArgumentException("dataset not found");

Try / catch

try { experimentService.create(request); } catch (RuntimeException e) { log.error("experiment create failed", e); throw new ResponseStatusException(HttpStatus.INTERNAL_SERVER_ERROR, "experiment persistence failed", e); }

Prevention

When it happens

Trigger: Insert affected 0 rows due to a constraint violation, missing required column data, schema drift, or a database error converted by MyBatis into a 0-row update count.

Common situations: experiment table schema missing new columns added in code; foreign key to a non-existent dataset/model; DB connection failing mid-request; running against a read-only replica.

Related errors


AI-assisted analysis of alibaba/spring-ai-alibaba@f82da0b50f (2026-09-09). Data as JSON: /api/errors/8cbbf72a81f47b51. Report an issue: GitHub.