quarkusio/quarkus · error · PersistenceException

This PersistenceProvider does not support…

Error message

This PersistenceProvider does not support createEntityManagerFactory(PersistenceConfiguration).  Quarkus is responsible for creating the entity manager factory, so inject your entity manager factory through CDI instead: `@Inject EntityManagerFactory emf`.

What it means

Quarkus replaces the standard JPA bootstrap with FastBootHibernatePersistenceProvider, which only supports creation from a PersistenceUnitInfo. The Jakarta Persistence programmatic PersistenceConfiguration overload is unsupported because Quarkus owns entity manager factory creation, so this method always throws PersistenceException pointing to CDI injection.

Solutions

  1. Inject the factory via CDI: @Inject EntityManagerFactory emf, or @Inject EntityManager em / Session session directly.
  2. Configure the persistence unit through application.properties (quarkus.hibernate-orm.*) instead of PersistenceConfiguration.
  3. For multiple PUs, use qualified injection (@PersistenceUnit("name") / @Inject @PersistenceUnitName("name")).
  4. Run plain-JPA integration tests outside the Quarkus runtime provider.

Example fix

// before
EntityManagerFactory emf = Persistence.createEntityManagerFactory(
    new PersistenceConfiguration("mypu").property(...));
// after
@Inject
EntityManagerFactory emf; // or @Inject EntityManager em;
Defensive patterns

Strategy: type-guard

Validate before calling

EntityManagerFactory emf;
try {
    emf = CDI.current().select(EntityManagerFactory.class).get();
} catch (NoSuchEJBException | IllegalStateException e) {
    throw new IllegalStateException("EMF not available via CDI; do not use Persistence.createEntityManagerFactory(PersistenceConfiguration) in Quarkus");
}

Type guard

boolean isQuarkusRuntime() {
    return Thread.currentThread().getContextClassLoader()
        .getResource("io/quarkus/hibernate/orm/runtime/FastBootHibernatePersistenceProvider.class") != null;
}

Try / catch

try {
    Persistence.createEntityManagerFactory(config);
} catch (PersistenceException e) {
    if (e.getMessage().contains("does not support createEntityManagerFactory")) {
        emf = CDI.current().select(EntityManagerFactory.class).get();
    } else throw e;
}

Prevention

When it happens

Trigger: Calling Persistence.createEntityManagerFactory(PersistenceConfiguration) in a Quarkus application; the provider resolves to FastBootHibernatePersistenceProvider and throws immediately.

Common situations: Porting plain Jakarta Persistence bootstrap code to Quarkus; tests building an EMF programmatically; following non-Quarkus documentation; migrating code that used a configuration builder for the EMF.

Related errors


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

Appendix: source

Thrown at extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/FastBootHibernatePersistenceProvider.java:107

        if (builder == null) {
            log.trace("Could not obtain matching EntityManagerFactoryBuilder, returning null");
            return null;
        } else {
            return builder.build();
        }
    }

    @SuppressWarnings("rawtypes")
    @Override
    public EntityManagerFactory createContainerEntityManagerFactory(PersistenceUnitInfo info, Map properties) {
        log.tracef("Starting createContainerEntityManagerFactory : %s", info.getPersistenceUnitName());

        return getEntityManagerFactoryBuilder(info, properties).build();
    }

    @Override
    public EntityManagerFactory createEntityManagerFactory(PersistenceConfiguration configuration) {
        throw new PersistenceException(
                "This PersistenceProvider does not support createEntityManagerFactory(PersistenceConfiguration). "
                        + " Quarkus is responsible for creating the entity manager factory, so inject your entity manager"
                        + " factory through CDI instead: `@Inject EntityManagerFactory emf`.");
    }

    @SuppressWarnings("rawtypes")
    @Override
    public void generateSchema(PersistenceUnitInfo info, Map map) {
        log.tracef("Starting generateSchema : PUI.name=%s", info.getPersistenceUnitName());

        final EntityManagerFactoryBuilder builder = getEntityManagerFactoryBuilder(info, map);
        builder.generateSchema();
    }

    @SuppressWarnings("rawtypes")
    @Override
    public boolean generateSchema(String persistenceUnitName, Map map) {
        log.tracef("Starting generateSchema for persistenceUnitName %s", persistenceUnitName);

View on GitHub (pinned to e1c734241f)