Trying to use JPA in OSGI always gives me the error “javax.persistence.PersistenceException: No Persistence provider for EntityManager named …”. Reason: Persistence.createEntityManagerFactory() uses the ClassLoader to load resources. It seems to be the ThreadContext ClassLoader. So in OSGI it fails due to the OSGI classloader tricks. Using the tricks given in http://lsd.luminis.nl/jpa-persistence-in-osgi-with-openjpa/ I got this to work. That is, the following..
ClassLoader oldCL = Thread.currentThread().getContextClassLoader();
emf = Persistence.createEntityManagerFactory(“my-persistence-manager”);
And no matter what you do, you get the same error. Even if it never finds the persistence.xml file, or if you typoed tha name in it, or anything else. Oh what a wonderful error message, how informative.
You might think the EclipseLink being the reference JPA implementation you might get proper OSGI consideration but no. After all, it claims to be all OSGIfied. I guess that is no more than export some packages then. And after this fix, Hibernate works for me just as well as, just need to add some exports and manage the dependencies myself. Not a big deal compared to debugging this in the first place.