{"record":{"id":"54c0068b0c988838","repo":"hibernate/hibernate-orm","slug":"mysql-does-not-support-dropping-creating-dropping","errorCode":null,"errorMessage":"MySQL does not support dropping creating/dropping schemas in the JDBC sense","messagePattern":"MySQL does not support dropping creating/dropping schemas in the JDBC sense","errorType":"exception","errorClass":"UnsupportedOperationException","httpStatus":null,"severity":"error","filePath":"hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/MySQLLegacyDialect.java","lineNumber":1022,"sourceCode":"\n\t@Override\n\tpublic String[] getCreateCatalogCommand(String catalogName) {\n\t\treturn new String[] { \"create database \" + catalogName };\n\t}\n\n\t@Override\n\tpublic String[] getDropCatalogCommand(String catalogName) {\n\t\treturn new String[] { \"drop database \" + catalogName };\n\t}\n\n\t@Override\n\tpublic boolean canCreateSchema() {\n\t\treturn false;\n\t}\n\n\t@Override\n\tpublic String[] getCreateSchemaCommand(String schemaName) {\n\t\tthrow new UnsupportedOperationException( \"MySQL does not support dropping creating/dropping schemas in the JDBC sense\" );\n\t}\n\n\t@Override\n\tpublic String[] getDropSchemaCommand(String schemaName) {\n\t\tthrow new UnsupportedOperationException( \"MySQL does not support dropping creating/dropping schemas in the JDBC sense\" );\n\t}\n\n\t@Override\n\tpublic boolean supportsIfExistsBeforeTableName() {\n\t\treturn true;\n\t}\n\n\t@Override\n\tpublic String getSelectGUIDString() {\n\t\treturn \"select uuid()\";\n\t}\n\n\t@Override","sourceCodeStart":1004,"sourceCodeEnd":1040,"githubUrl":"https://github.com/hibernate/hibernate-orm/blob/fad1729dce015f908198d57a8d80274a30f905a5/hibernate-community-dialects/src/main/java/org/hibernate/community/dialect/MySQLLegacyDialect.java#L1004-L1040","documentation":"MySQL maps JDBC catalogs to databases and has no separate JDBC-style schema object, so MySQLLegacyDialect.canCreateSchema() returns false and getCreateSchemaCommand()/getDropSchemaCommand() throw UnsupportedOperationException instead of returning DDL. Hibernate raises this when its schema-management tooling (hibernate.hbm2ddl.auto, SchemaExport/SchemaUpdate) or schema-based multi-tenancy asks the dialect to emit CREATE SCHEMA for MySQL, because no valid MySQL statement exists for that request; database lifecycle goes through the catalog commands (create/drop database) instead.","triggerScenarios":"hibernate.hbm2ddl.auto=create or create-drop combined with hibernate.default_schema or @Table(schema=...) mappings on MySQL; programmatic SchemaExport.create()/drop() runs that need schema DDL; MultiTenancyStrategy.SCHEMA connection providers against MySQL.","commonSituations":"Porting an application from PostgreSQL (which has real schemas) to MySQL while keeping schema attributes in entity mappings; teams assuming 'schema' and 'database' are interchangeable Hibernate settings; tenant provisioning code written against a schema-per-tenant design.","solutions":["Use the catalog side on MySQL: set hibernate.default_catalog and @Table(catalog=...) so Hibernate maps to create/drop database instead of schema DDL","Create or drop the database out-of-band (Flyway/Liquibase or provisioning scripts) before Hibernate starts","For multi-tenancy on MySQL, switch from schema-per-tenant to database/catalog-per-tenant since canCreateSchema() is false","Guard programmatic schema tools with dialect.canCreateSchema() before invoking any schema creation path"],"exampleFix":"// before\n@Entity\n@Table(name = \"orders\", schema = \"sales\")\n// hibernate.default_schema=sales  -> getCreateSchemaCommand() throws on MySQL\n\n// after\n@Entity\n@Table(name = \"orders\", catalog = \"sales\")\n// hibernate.default_catalog=sales -> dialect emits 'create/drop database'","handlingStrategy":"validation","validationCode":"Dialect dialect = sessionFactory.getJdbcServices().getDialect();\nif ( !dialect.canCreateSchema() ) {\n    // MySQL: provision the database yourself instead of asking Hibernate for schema DDL\n    try ( Statement st = connection.createStatement() ) {\n        st.execute( \"create database if not exists sales\" );\n    }\n}","typeGuard":null,"tryCatchPattern":"try {\n    new SchemaExport( metadata ).createOnly( EnumSet.of( TargetType.DATABASE ), serviceRegistry );\n}\ncatch ( UnsupportedOperationException e ) {\n    // MySQL rejects JDBC-style schema DDL: create/drop the database out-of-band, then retry without schema DDL\n}","preventionTips":["Never set hibernate.default_schema with MySQLLegacyDialect; use hibernate.default_catalog","Check Dialect.canCreateSchema() before any programmatic schema creation or drop","Keep database lifecycle DDL in Flyway/Liquibase rather than hbm2ddl on MySQL"],"tags":["mysql","schema","hbm2ddl","schema-export","multi-tenancy"],"backgroundTag":"unsupported-schema-management","analyzedSha":"fad1729dce015f908198d57a8d80274a30f905a5","analyzedAt":"2026-08-22T04:13:57.527Z","schemaVersion":2},"datasetVersion":"2026-08-22T09:17:25.309Z"}