I’ve imported the Hibernate Spatial tutorial into Eclipse but when the main application is run, it can’t find the SPATIAL-JPA definition in persistence.xml. persistence.xml is in target\classes\META-INF and is found in the application with: URL resource = Thread.currentThread().getContextClassLoader().getResource(“META-INF/persistence.xml”);
but emFactory = (Persistence.createEntityManagerFactory(“SPATIAL-JPA”));
fails with Cannot create EntityManagerFactory. Exception in thread “main” java.lang.ExceptionInInitializerError
** at recipe.HSDB2.getEmFactory(HSDB2.java:155)**
** at recipe.HSDB2.createEntityManager(HSDB2.java:162)**
** at recipe.HSDB2.main(HSDB2.java:30)** Caused by: javax.persistence.PersistenceException: No Persistence provider for EntityManager named SPATIAL-JPA
The application runs fine from the command line using the mvn exec command.
If it runs fine with Maven, then you should import the project in Eclipse from Maven.
I haven’t used Eclipse since 2005 as I had switched to using IntelliJ IDEA and never looked back. If you import the project from Maven in IDEA, it works like a charm.
I tried to run in IDEA but got similar but slightly different errors - no idea the cause.
Cannot create EntityManagerFactory.
Exception in thread “main” java.lang.ExceptionInInitializerError
at recipe.HSDB2.getEmFactory(HSDB2.java:158)
at recipe.HSDB2.createEntityManager(HSDB2.java:165)
at recipe.HSDB2.main(HSDB2.java:30)
Caused by: java.lang.NoClassDefFoundError: javax/xml/bind/JAXBException
at org.hibernate.boot.spi.XmlMappingBinderAccess.(XmlMappingBinderAccess.java:43)
at org.hibernate.boot.MetadataSources.(MetadataSources.java:87)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.(EntityManagerFactoryBuilderImpl.java:209)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.(EntityManagerFactoryBuilderImpl.java:171)
at org.hibernate.jpa.boot.spi.Bootstrap.getEntityManagerFactoryBuilder(Bootstrap.java:76)
at org.hibernate.jpa.HibernatePersistenceProvider.getEntityManagerFactoryBuilder(HibernatePersistenceProvider.java:179)
at org.hibernate.jpa.HibernatePersistenceProvider.getEntityManagerFactoryBuilderOrNull(HibernatePersistenceProvider.java:127)
at org.hibernate.jpa.HibernatePersistenceProvider.getEntityManagerFactoryBuilderOrNull(HibernatePersistenceProvider.java:69)
at org.hibernate.jpa.HibernatePersistenceProvider.createEntityManagerFactory(HibernatePersistenceProvider.java:52)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:79)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:54)
at recipe.HSDB2.getEmFactory(HSDB2.java:155)
… 2 more
Caused by: java.lang.ClassNotFoundException: javax.xml.bind.JAXBException
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:582)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:185)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:496)
Thank you.
This was actually a new problem in moving to IDEA. The classNotFound error didn’t occur in Eclipse for whatever reasons.
The real problem was that the DB2 JDBC driver jar file was not in the build path. I found it by debugging into HibernatePersistenceProvider until it got an exception. Too bad that by the time it exits, it just says:
javax.persistence.PersistenceException: No Persistence provider found for EntityManager named SPATIAL-JPA.
Adding the DB2 JDBC driver to the path made it work for both Eclipse and IDEA.
I’m not sure why it worked fine from the command line - must be different environment.