0

For testing purposes, I'm trying to use hibernate with an h2 in-memory database. I'm using Maven for dependency management. Tomcat does not seem to find the h2 database driver - however, adding postgresql via maven, starting a local postgresql-daemon and connecting to it works just fine.

I am also able to run some simple JUnit-Tests (without tomcat) against the h2 in-memory database.

My initialization code (in code instead of an xml to rule out any errors there):

Properties props = new Properties();

// h2 in-memory
props.setProperty("hibernate.dialect", "org.hibernate.dialect.H2Dialect");
props.setProperty("hibernate.connection.url", "jdbc:h2:mem:test");

// postgresql
props.setProperty("hibernate.dialect", "org.hibernate.dialect.PostgreSQLDialect");
props.setProperty("hibernate.connection.driver_class", "org.postgresql.Driver");
props.setProperty("hibernate.connection.username", "admin");
props.setProperty("hibernate.connection.password", "...password...");
props.setProperty("hibernate.connection.url", "jdbc:postgresql://localhost:5432/glmtest");

// Common Options
props.setProperty("hibernate.connection_pool_size", "1");
props.setProperty("hibernate.hbm2ddl.auto", "create");
props.setProperty("hibernate.show_sql", "true");

sessionFactory =  
        new Configuration()
        .addProperties(props)
        .addAnnotatedClass( AnEntity.class )
        .buildSessionFactory();

If I run a unit-test against this class with the H2 initialization, everything works. Upon deployment on the tomcat, the following error is shown:

org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]
org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:244)
org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:208)
org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:189)
[...]

org.hibernate.exception.JDBCConnectionException: Error calling DriverManager#getConnection
org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLStateConversionDelegate.java:115)
org.hibernate.engine.jdbc.connections.internal.BasicConnectionCreator$1$1.convert(BasicConnectionCreator.java:101)
org.hibernate.engine.jdbc.connections.internal.BasicConnectionCreator.convertSqlException(BasicConnectionCreator.java:123)
[...]

java.sql.SQLException: No suitable driver found for jdbc:h2:mem:test
java.sql.DriverManager.getConnection(DriverManager.java:689)
java.sql.DriverManager.getConnection(DriverManager.java:208)
org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionCreator.makeConnection(DriverManagerConnectionCreator.java:34)
[...]

Full error is shown on this page.

Both libraries (h2 and psql) are installed via Maven, both without a scope (defaulting to "compile"). I am on the right tomcat server, I am deploying correctly (since postgresql does work), tomcat and java are using the same JRE8 runtime environment. Other registered webservices (main project uses JAX) without database-dependency work as expected.

I'm out of ideas - any help much appreciated.

1 Answer 1

3

You are setting the Driver class for posgresql but not for h2

props.setProperty("hibernate.connection.driver_class", "org.h2.Driver");
Sign up to request clarification or add additional context in comments.

1 Comment

That did the trick - thanks! But why did the unit tests run with the exact same configuration (without explicitly setting the driver_class property) in JUnit?

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.