quarkusio/quarkus · error · HibernateException

Legacy setting being used: 'hibernate.ejb.session_factory_ob

Error message

Legacy setting being used: 'hibernate.ejb.session_factory_observer' was replaced by '<SESSION_FACTORY_OBSERVER>'. Please update your configuration.

What it means

FastBootEntityManagerFactoryBuilder.populate rejects the deprecated legacy setting 'hibernate.ejb.session_factory_observer', which older Hibernate ORM (4.x) used for attaching SessionFactoryObservers. Quarkus's fast-boot builder throws HibernateException to force migration to the modern org.hibernate.cfg.AvailableSettings.SESSION_FACTORY_OBSERVER key.

Source

Thrown at extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/boot/FastBootEntityManagerFactoryBuilder.java:156

    }

    private String getExceptionHeader() {
        return "[PersistenceUnit: " + puDescriptor.getName() + "] ";
    }

    protected void populate(String persistenceUnitName, SessionFactoryOptionsBuilder options, StandardServiceRegistry ssr) {
        // will use user override value or default to false if not supplied to follow
        // JPA spec.
        final boolean jtaTransactionAccessEnabled = runtimeSettings.getBoolean(
                org.hibernate.cfg.AvailableSettings.ALLOW_JTA_TRANSACTION_ACCESS);
        if (!jtaTransactionAccessEnabled) {
            options.disableJtaTransactionAccess();
        }

        //Check for use of deprecated org.hibernate.jpa.AvailableSettings.SESSION_FACTORY_OBSERVER
        final Object legacyObserver = runtimeSettings.get("hibernate.ejb.session_factory_observer");
        if (legacyObserver != null) {
            throw new HibernateException("Legacy setting being used: 'hibernate.ejb.session_factory_observer' was replaced by '"
                    + org.hibernate.cfg.AvailableSettings.SESSION_FACTORY_OBSERVER + "'. Please update your configuration.");
        }

        // Locate and apply any requested SessionFactoryObserver
        final Object sessionFactoryObserverSetting = runtimeSettings
                .get(org.hibernate.cfg.AvailableSettings.SESSION_FACTORY_OBSERVER);
        if (sessionFactoryObserverSetting != null) {

            final StrategySelector strategySelector = ssr.getService(StrategySelector.class);
            final SessionFactoryObserver suppliedSessionFactoryObserver = strategySelector
                    .resolveStrategy(SessionFactoryObserver.class, sessionFactoryObserverSetting);
            options.addSessionFactoryObservers(suppliedSessionFactoryObserver);
        }

        options.addSessionFactoryObservers(new ServiceRegistryCloser());

        //New in ORM 6.2:
        options.addSessionFactoryObservers(new SessionFactoryObserverForNamedQueryValidation(metadata));

View on GitHub (pinned to e1c734241f)

Solutions

  1. Remove hibernate.ejb.session_factory_observer from persistence.xml/properties.
  2. Register the observer via the modern key org.hibernate.cfg.AvailableSettings.SESSION_FACTORY_OBSERVER (hibernate.session_factory_observer) if truly needed.
  3. Prefer Quarkus-native mechanisms (CDI observers / build-time integration) instead of raw Hibernate observer settings.

Example fix

<!-- before -->
<property name="hibernate.ejb.session_factory_observer" value="com.acme.MyObserver"/>
<!-- after -->
<property name="hibernate.session_factory_observer" value="com.acme.MyObserver"/>
Defensive patterns

Strategy: validation

Validate before calling

grep -rn "hibernate.ejb." persistence.xml src/main/resources/

Prevention

When it happens

Trigger: A persistence.xml, quarkus.hibernate-orm.persistence-unit.<name>.properties entry, or hibernate.properties still specifies hibernate.ejb.session_factory_observer; a legacy library injects the old key into runtime settings.

Common situations: Migrating a legacy Spring/Hibernate 4 config into Quarkus; copy-pasted persistence.xml carrying obsolete hibernate.ejb.* properties.

Related errors


AI-assisted analysis of quarkusio/quarkus@e1c734241f (2026-09-05). Data as JSON: /api/errors/e0c3dcae4952e445. Report an issue: GitHub.