{"record":{"id":"dc08fb4928500cfb","repo":"hibernate/hibernate-orm","slug":"entity-may-not-be-null-dc08fb","errorCode":null,"errorMessage":"Entity may not be null","messagePattern":"Entity may not be null","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"hibernate-core/src/main/java/org/hibernate/jpa/internal/PersistenceUnitUtilImpl.java","lineNumber":88,"sourceCode":"\t\tHibernate.initialize( entity );\n\t}\n\n\t@Override\n\tpublic boolean isInstance(@Nonnull Object entity, @Nonnull Class<?> entityClass) {\n\t\treturn entityClass.isAssignableFrom( Hibernate.getClassLazy( entity ) );\n\t}\n\n\t@Override\n\t@Nonnull\n\tpublic <T> Class<? extends T> getClass(@Nonnull T entity) {\n\t\treturn Hibernate.getClassLazy( entity );\n\t}\n\n\t@Override\n\tpublic Object getIdentifier(@Nonnull Object entity) {\n\t\t//noinspection ConstantValue\n\t\tif ( entity == null ) {\n\t\t\tthrow new IllegalArgumentException( \"Entity may not be null\" );\n\t\t}\n\n\t\tfinal var lazyInitializer = extractLazyInitializer( entity );\n\t\tif ( lazyInitializer != null ) {\n\t\t\treturn lazyInitializer.getInternalIdentifier();\n\t\t}\n\t\telse if ( isManagedEntity( entity ) ) {\n\t\t\tfinal var entityEntry = asManagedEntity( entity ).$$_hibernate_getEntityEntry();\n\t\t\tif ( entityEntry != null ) {\n\t\t\t\treturn entityEntry.getId();\n\t\t\t}\n\t\t\telse {\n\t\t\t\treturn getIdentifierFromPersister( entity );\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\treturn getIdentifierFromPersister( entity );\n\t\t}","sourceCodeStart":70,"sourceCodeEnd":106,"githubUrl":"https://github.com/hibernate/hibernate-orm/blob/fad1729dce015f908198d57a8d80274a30f905a5/hibernate-core/src/main/java/org/hibernate/jpa/internal/PersistenceUnitUtilImpl.java#L70-L106","documentation":"Thrown by PersistenceUnitUtilImpl.getIdentifier() as an IllegalArgumentException when it is called with a null entity. PersistenceUnitUtil (jakarta.persistence.PersistenceUnitUtil) contractually requires a non-null managed entity; the implementation guards explicitly even though the parameter is annotated @Nonnull.","triggerScenarios":"Calling entityManagerFactory.getPersistenceUnitUtil().getIdentifier(entity) where entity is null - typically because a lookup returned null (findById miss, map.get miss) or an association was never initialized.","commonSituations":"Optional-style lookups unwrapped unsafely; passing an un fetched/unset relation field straight to getIdentifier; helper methods that accept Object without null checks.","solutions":["Null-check the entity before calling getIdentifier.","Fix the upstream lookup that produced null (handle empty Optional from findById).","Wrap the call in Objects.requireNonNullElse or return early when the reference is absent."],"exampleFix":"// before\nObject id = emf.getPersistenceUnitUtil().getIdentifier(orderService.find(id)); // find() may return null\n\n// after\nOrder order = orderService.find(id);\nif (order == null) return null;\nObject oid = emf.getPersistenceUnitUtil().getIdentifier(order);","handlingStrategy":"validation","validationCode":"if (entity == null) throw new IllegalArgumentException(\"entity must be loaded before id extraction\");\nObject id = emf.getPersistenceUnitUtil().getIdentifier(entity);","typeGuard":"Object identifierOf(EntityManagerFactory emf, @Nullable Object entity) {\n    return entity == null ? null : emf.getPersistenceUnitUtil().getIdentifier(entity);\n}","tryCatchPattern":null,"preventionTips":["Resolve Optional results fully (orElseThrow/orElse) before touching PersistenceUnitUtil.","Encapsulate getIdentifier/getVersion behind helper methods that accept null defensively."],"tags":["hibernate","jpa","null-check","persistence-unit-util","identifier"],"backgroundTag":"null-argument","analyzedSha":"fad1729dce015f908198d57a8d80274a30f905a5","analyzedAt":"2026-08-22T04:13:57.527Z","schemaVersion":2},"datasetVersion":"2026-08-22T09:17:25.309Z"}