UnknownServiceException: Unknown service requested [EnversService]

307 Views Asked by At

I want to run Hibernate in OSGi. I have added the standard Hibernate OSGi bundle and a Blueprint implementation, so that Envers gets registered right on startup.

Even without any kind of documentation I found out you have to start Envers, because... I doubt there is a logical reason, it does not work otherwise.

However now, even though Envers was registered in Blueprint, I get the following exception:

org.hibernate.service.UnknownServiceException: Unknown service requested [org.hibernate.envers.boot.internal.EnversService]
at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:184)
at org.hibernate.envers.boot.internal.TypeContributorImpl.contribute(TypeContributorImpl.java:22)
at org.hibernate.boot.internal.MetadataBuilderImpl.applyTypes(MetadataBuilderImpl.java:280)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.populate(EntityManagerFactoryBuilderImpl.java:798)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.<init>(EntityManagerFactoryBuilderImpl.java:187)
at org.hibernate.jpa.boot.spi.Bootstrap.getEntityManagerFactoryBuilder(Bootstrap.java:34)
at org.hibernate.jpa.HibernatePersistenceProvider.getEntityManagerFactoryBuilder(HibernatePersistenceProvider.java:165)
at org.hibernate.jpa.HibernatePersistenceProvider.getEntityManagerFactoryBuilderOrNull(HibernatePersistenceProvider.java:114)
at org.hibernate.osgi.OsgiPersistenceProvider.createEntityManagerFactory(OsgiPersistenceProvider.java:78)
at org.acme.project.Main.startSession(PersistenceUnitJpaProvider.java:38)

The stack trace starts at PersistenceProvider#createEntityManagerFactory in the following snippet:

public class Main {

    private EntityManagerFactory entityManagerFactory;

    public void startSession(Map<String, Object> config) {
        BundleContext context = FrameworkUtil.getBundle(getClass()).getBundleContext();
        ServiceReference<PersistenceProvider> serviceReference = context.getServiceReference(PersistenceProvider.class);
        PersistenceProvider persistenceProvider = context.getService(serviceReference);

        this.entityManagerFactory = persistenceProvider.createEntityManagerFactory("persistenceUnit", config);

        context.ungetService(serviceReference);
    }

I found this bug, and maybe this issue is fixed in the current version of Hibernate. But since the bundle IDs are broken, I have to use 5.1.

So Envers is registered, but not really. What could be the reason for such a strange error message?

0

There are 0 best solutions below