I have some more information and context on this issue that may help
in understanding it. For reference, I've created a sample project,
which is available here:

http://www.rickherrick.com/hbm_sample.jar

This is your basic Eclipse/STS/Maven 2-type project, so just extract
and you should be able to run:

jar xf hbm_sample.jar
cd hbm_sample
mvn clean install

When you first run it, you should get a successful build. The reason
this works is that the class CategoryServiceTests, in the method
testCreateCategory(), actually explicitly creates the category table
in lines 46-48. Now delete those three lines and run again. Now you
should get the error about which I'm curious:

Tests in error:
 
testCreateCategory(org.test.hbm_sample.services.CategoryServiceTests):
could not insert: [org.test.hbm_sample.api.Category]; SQL [insert into
category (event, scope, id) values (?, ?, ?)]; nested exception is
org.hibernate.exception.SQLGrammarException: could not insert:
[org.test.hbm_sample.api.Category]

Tests run: 3, Failures: 0, Errors: 1, Skipped: 0

This shows the failure to create that category table under these
circumstances. And here's where the H2 and PostgreSQL runs diverge.
Try changing lines 34 and 35 of the BasicPlatformTests-context.xml and
CategoryServiceTests-context.xml configuration files to use the
PostgreSQL data source and Hibernate properties:

    <bean id="dataSource" parent="postgresqlDataSource" />
    <bean id="hibernateProperties"
parent="postgresqlHibernateProperties" />

Note that, to use the data source as configured, you need a database
named test owned by a user named test with the password test. You can
just modify the PostgreSQL data source definition to use an existing
table and user if that's easier.

Now run Maven on this again and it should execute successfully,
meaning that the same code and configuration that just failed for H2
works properly for PostgreSQL.

Now here's what's REALLY strange about it, I think. The
BasicPlatformTests unit tests never fail, in spite of the fact that
they're doing nearly the same thing in the testCategoryDAO() method as
what the CategoryServiceTests.testCreateCategory() function is doing.
They're both using the DAO to create and retrieve objects in the
database. The primary difference that I see between them is that the
CategoryServiceTests calls cross @Transactional boundaries, whereas
everything in the BasicPlatformTests is within a single @Transactional
block. That might mean that the database is getting dropped between
the session invocations on the service, but the same behavior doesn't
happen with PostgreSQL, which it seems like it should.

If anyone has any insight or ideas on this, I'd love to hear them. We
really want to be able to run our unit tests without having to stand
up a test database in the build environment, but until we can
understand why we're seeing different behavior from H2, we can't
really do that!

Thanks!

-- 
You received this message because you are subscribed to the Google Groups "H2 
Database" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/h2-database?hl=en.

Reply via email to