{"record":{"id":"5999711b4c1a6953","repo":"alibaba/spring-ai-alibaba","slug":"cannot-delete-published-version","errorCode":null,"errorMessage":"Cannot delete published version: ","messagePattern":"Cannot delete published version: ","errorType":"exception","errorClass":"IllegalStateException","httpStatus":null,"severity":"error","filePath":"spring-ai-alibaba-admin/spring-ai-alibaba-admin-server-start/src/main/java/com/alibaba/cloud/ai/studio/admin/service/impl/DatasetVersionServiceImpl.java","lineNumber":190,"sourceCode":"\n    /**\n     * Delete dataset version by ID\n     */\n    @Transactional\n    public void deleteById(Long id) {\n        log.info(\"Deleting dataset version: {}\", id);\n        \n        if (id == null) {\n            throw new IllegalArgumentException(\"Version ID cannot be null\");\n        }\n\n        DatasetVersionDO existingVersion = datasetVersionMapper.selectById(id);\n        if (existingVersion == null) {\n            throw new IllegalArgumentException(\"Dataset version not found: \" + id);\n        }\n\n        if (\"PUBLISHED\".equals(existingVersion.getStatus())) {\n            throw new IllegalStateException(\"Cannot delete published version: \" + id);\n        }\n\n        int result = datasetVersionMapper.deleteById(id);\n        if (result <= 0) {\n            throw new RuntimeException(\"Failed to delete dataset version\");\n        }\n\n        log.info(\"Dataset version deleted successfully: {}\", id);\n    }\n\n    @Override\n    public PageResult<Experiment> getExperiments(DatasetExperimentsListRequest request) {\n        long offset = (request.getPageNumber() - 1L) * request.getPageSize();\n\n        List<ExperimentDO> experimentDOList = experimentMapper.selectByDatasetId(request.getDatasetId(), offset, request.getPageSize());\n\n        Integer totalCount = experimentMapper.selectCountByDatasetId(request.getDatasetId());\n","sourceCodeStart":172,"sourceCodeEnd":208,"githubUrl":"https://github.com/alibaba/spring-ai-alibaba/blob/f82da0b50f35744c13968191be2b1cd2452ef550/spring-ai-alibaba-admin/spring-ai-alibaba-admin-server-start/src/main/java/com/alibaba/cloud/ai/studio/admin/service/impl/DatasetVersionServiceImpl.java#L172-L208","documentation":"deleteById() refuses to delete versions whose status is PUBLISHED, throwing IllegalStateException(\"Cannot delete published version: \" + id). This is a business-rule protection: published versions are considered immutable reference data and must be unpublished or archived through another workflow first.","triggerScenarios":"Calling deleteById on a version row whose status column equals \"PUBLISHED\"; attempting bulk cleanup that includes published versions.","commonSituations":"Cleaning up old dataset versions after an evaluation cycle and hitting published baselines; scripts that iterate all versions without filtering status; API users unaware of the publication lifecycle.","solutions":["Change the version status away from PUBLISHED (e.g. via update with status ARCHIVED/DRAFT) before deleting.","Filter the deletion set to exclude versions with status PUBLISHED.","If policy allows, unpublish the version through the intended workflow, then retry the delete."],"exampleFix":"// before\nservice.deleteById(publishedId); // IllegalStateException\n// after\nDatasetVersion v = service.getById(publishedId);\nif (\"PUBLISHED\".equals(v.getStatus())) {\n    service.update(new DatasetVersionUpdateRequest(publishedId, null, \"ARCHIVED\"));\n}\nservice.deleteById(publishedId);","handlingStrategy":"validation","validationCode":"DatasetVersion v = service.getById(id);\nif (v != null && \"PUBLISHED\".equals(v.getStatus())) {\n    throw new IllegalStateException(\"unpublish or archive version \" + id + \" before deleting\");\n}","typeGuard":"boolean isPublished(DatasetVersion v) { return v != null && \"PUBLISHED\".equals(v.getStatus()); }","tryCatchPattern":"try {\n    service.deleteById(id);\n} catch (IllegalStateException e) {\n    // surface 'unpublish first' guidance to the user\n    return ResponseEntity.status(HttpStatus.CONFLICT).body(Map.of(\"error\", e.getMessage()));\n}","preventionTips":["Filter deletion candidates by status != PUBLISHED.","Implement an explicit unpublish/archive workflow before deletion.","Return HTTP 409 (conflict) from controllers catching this error so clients understand the lifecycle rule."],"tags":["invalid-state","business-rule","delete","dataset-version"],"backgroundTag":"invalid-state-transition","analyzedSha":"f82da0b50f35744c13968191be2b1cd2452ef550","analyzedAt":"2026-09-09T15:32:42.421Z","contentChangedAt":"2026-09-09T15:32:42.421Z","schemaVersion":2},"datasetVersion":"2026-09-14T11:17:12.474Z"}