hibernate/hibernate-orm · error · HibernateException

Unable to load TypeSafeActivator class

Error message

Unable to load TypeSafeActivator class

What it means

The Bean Validation API was detectable, but ClassLoaderService.classForName for the internal TypeSafeActivator failed and was wrapped in this HibernateException. Typically the API is only partially present — some jakarta.validation classes are missing — so loading the activator class, which statically references ValidatorFactory, dies inside the classloader.

Source

Thrown at hibernate-core/src/main/java/org/hibernate/boot/beanvalidation/BeanValidationIntegrator.java:189

	 *
	 * @param modes The requested validation modes.
	 */
	private void validateMissingBeanValidationApi(Set<ValidationMode> modes, ValidationConstraintDdlInfluence constraintInfluence) {
		if ( modes.contains( ValidationMode.CALLBACK ) ) {
			throw new IntegrationException( "Jakarta Validation API was not available, but 'callback' validation was requested" );
		}
		if ( constraintInfluence == ValidationConstraintDdlInfluence.REQUIRED ) {
			throw new IntegrationException( "Bean Validation API was not available, but '"
					+ SchemaToolingSettings.APPLY_VALIDATION_CONSTRAINTS + "' was set to 'REQUIRED'" );
		}
	}

	private Class<?> loadTypeSafeActivatorClass(ClassLoaderService classLoaderService) {
		try {
			return classLoaderService.classForName( ACTIVATOR_CLASS_NAME );
		}
		catch (Exception e) {
			throw new HibernateException( "Unable to load TypeSafeActivator class", e );
		}
	}

	private record ActivationContextImpl(
			Set<ValidationMode> modes,
			ValidationConstraintDdlInfluence constraintInfluence,
			Metadata metadata,
			SessionFactoryImplementor sessionFactory,
			SessionFactoryServiceRegistry serviceRegistry)
				implements ActivationContext {

		@Override
		public Set<ValidationMode> getValidationModes() {
			return modes;
		}

		@Override
		public Metadata getMetadata() {

View on GitHub (pinned to fad1729dce)

Solutions

  1. Replace partial/overlapping validation jars with the exact jakarta.validation-api version your hibernate-core release requires
  2. Find and remove duplicate or split packages spanning javax and jakarta artifacts
  3. If validation was never intended, set validation mode NONE before the SessionFactory is built
Defensive patterns

Strategy: validation

Validate before calling

// verify the validation API is complete, not just present
static void assertValidationApiComplete() {
    for (String cn : new String[] {
            "jakarta.validation.Validation",
            "jakarta.validation.ValidatorFactory",
            "jakarta.validation.ConstraintViolation"}) {
        try { Class.forName(cn); }
        catch (ClassNotFoundException e) {
            throw new IllegalStateException("Incomplete/partial jakarta.validation API on classpath", e);
        }
    }
}

Try / catch

try {
    sessionFactory = new Configuration().buildSessionFactory();
} catch (HibernateException e) {
    if (e.getMessage().contains("Unable to load TypeSafeActivator class"))
        throw new IllegalStateException("Partial validation API detected; replace with the exact matching jar", e);
    throw e;
}

Prevention

When it happens

Trigger: A classpath that contains jakarta.validation artifacts only partially (split packages across javax and jakarta jars, partial shading, an API jar of a different minor version than hibernate-core links against) while validation integration is being activated.

Common situations: Shaded/fat jars including only part of the API; ProGuard/minimization stripping 'unused' classes; mixed javax.validation:validation-api 2.x alongside jakarta.validation-api 3.x.

Related errors


AI-assisted analysis of hibernate/hibernate-orm@fad1729dce (2026-08-22). Data as JSON: /api/errors/cbd74b57586351d4. Report an issue: GitHub.