{"record":{"id":"731797c16a8e877e","repo":"hibernate/hibernate-orm","slug":"convert-placed-on-embeddable-must-define-attribu","errorCode":null,"errorMessage":"@Convert placed on @Embeddable must define attributeName","messagePattern":"@Convert placed on @Embeddable must define attributeName","errorType":"exception","errorClass":"IllegalStateException","httpStatus":null,"severity":"error","filePath":"hibernate-core/src/main/java/org/hibernate/boot/model/internal/ComponentPropertyHolder.java","lineNumber":217,"sourceCode":"\n\t\t// then we can overlay any conversions from the Embedded attribute\n\t\tembeddedMemberDetails.forEachAnnotationUsage( Convert.class, getSourceModelContext(), (usage) -> {\n\t\t\tfinal var info = new AttributeConversionInfo( usage, embeddedMemberDetails );\n\t\t\tif ( isEmpty( info.getAttributeName() ) ) {\n\t\t\t\tthrow new IllegalStateException( \"Convert placed on Embedded attribute must define (sub)attributeName\" );\n\t\t\t}\n\t\t\tinfoMap.put( info.getAttributeName(), info );\n\t\t} );\n\n\t\treturn infoMap;\n\t}\n\n\tprivate void processAttributeConversions(TypeDetails embeddableTypeDetails, Map<String, AttributeConversionInfo> infoMap) {\n\t\tfinal var embeddableClassDetails = embeddableTypeDetails.determineRawClass();\n\t\tembeddableClassDetails.forEachAnnotationUsage( Convert.class, getSourceModelContext(), (usage) -> {\n\t\t\tfinal var info = new AttributeConversionInfo( usage, embeddableClassDetails );\n\t\t\tif ( isEmpty( info.getAttributeName() ) ) {\n\t\t\t\tthrow new IllegalStateException( \"@Convert placed on @Embeddable must define attributeName\" );\n\t\t\t}\n\t\t\tinfoMap.put( info.getAttributeName(), info );\n\t\t} );\n\t}\n\n\tprivate Map<String,AttributeConversionInfo> processAttributeConversions(TypeDetails embeddableTypeDetails) {\n\t\tfinal Map<String,AttributeConversionInfo> infoMap = new HashMap<>();\n\t\tprocessAttributeConversions( embeddableTypeDetails, infoMap );\n\t\treturn infoMap;\n\t}\n\n\t@Override\n\tprotected String normalizeCompositePath(String attributeName) {\n\t\treturn embeddedAttributeName + '.' + attributeName;\n\t}\n\n\t@Override\n\tprotected String normalizeCompositePathForLogging(String attributeName) {","sourceCodeStart":199,"sourceCodeEnd":235,"githubUrl":"https://github.com/hibernate/hibernate-orm/blob/fad1729dce015f908198d57a8d80274a30f905a5/hibernate-core/src/main/java/org/hibernate/boot/model/internal/ComponentPropertyHolder.java#L199-L235","documentation":"Error \"@Convert placed on @Embeddable must define attributeName\" thrown in hibernate/hibernate-orm.","triggerScenarios":"A @Convert / AttributeConverter declaration is missing required information or applies to a target that forbids conversion.","commonSituations":"@Convert without attributeName on a class-level or embedded target, or a converter clashing with a mapping annotation like @Enumerated/@Temporal that requires disableConversion=true.","solutions":["Set attributeName on the @Convert annotation placed on the @Embeddable class."],"exampleFix":null,"handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"fad1729dce015f908198d57a8d80274a30f905a5","analyzedAt":"2026-08-22T04:13:57.527Z","schemaVersion":2},"datasetVersion":"2026-08-22T09:17:25.309Z"}