Opened 2 months ago

Last modified 6 weeks ago

#2084 reopened enhancement

Upgrade to Hibernate 5.2

Reported by: nicklas Owned by: nicklas
Priority: major Milestone: BASE 3.12
Component: core Version:
Keywords: Cc:

Description

Latest version is Hibernate 5.2.10 (we are currently running Hibernate 5.0.7).

As always, it is a bit complicated to update Hibernate. Simply replacing the old JAR file with the new version causes 131 errors and 1477 warnings. Most seems to be related to things that have been moved around due to merging the Hibernate API with the Java Persistence API (JPA) (see https://github.com/hibernate/hibernate-orm/wiki/Migration-Guide---5.2).

Hopefully, this change will not be as difficult as the last Hibernate update (#1979).

Change History (28)

comment:1 Changed 2 months ago by nicklas

  • Owner changed from everyone to nicklas
  • Status changed from new to assigned

comment:2 Changed 2 months ago by nicklas

  • Summary changed from Upgrade Hibernate to Upgrade to Hibernate 5.2

comment:3 Changed 2 months ago by nicklas

(In [7362]) References #2084: Upgrade to Hibernate 5.2

Replaced old JAR files with new versions. Causes 131 compile errors and 1477 warnings.

comment:4 Changed 2 months ago by nicklas

(In [7363]) References #2084: Upgrade to Hibernate 5.2

Updated QueryWrapper and EntityQueryWrapper to use the new org.hibernate.query.Query interface. Down to 95 errors and 1398 warnings.

comment:5 Changed 2 months ago by nicklas

(In [7364]) References #2084: Upgrade to Hibernate 5.2

Updated SessionWrapper and StatelessSessionWrapper with new API methods. 26 error and 1328 warnings remaining.

comment:6 Changed 2 months ago by nicklas

(In [7365]) References #2084: Upgrade to Hibernate 5.2

Updated ExtendedPropertyAccessor. 24 errors and 1328 warnings remaining.

comment:7 Changed 2 months ago by nicklas

(In [7366]) References #2084: Upgrade to Hibernate 5.2

Temporary fix in HibernateUtil. Need to replace all org.hibernate.Query with org.hibernate.query.Query but that causes a lot of additional compilation errors. 22 errors and 1332 warnings remaining.

comment:8 Changed 2 months ago by nicklas

(In [7367]) References #2084: Upgrade to Hibernate 5.2

Fixed compilation errors in DbIndexWork and SchemaGenerator. The code can now be compiled (1332 warnings) and the installation program runs without any problem.

Need to compare the generated database with one generated with the old Hibernate.

Some test program fails:

TestUser FAILED                       
TestGlobalDefaultSetting FAILED       
TestClientDefaultSetting FAILED       
TestUserDefaultSetting FAILED         
TestUserClientSetting FAILED          
TestReporter FAILED                   
TestReporterList FAILED               
TestArrayDesign FAILED                
TestRawBioAssay FAILED                
TestSpotImages FAILED                 
TestDbControl FAILED                  
TestReporterFlatFileImporter FAILED   
TestReporterMapFlatFileImporter FAILED
TestPlateFlatFileImporter FAILED      
TestRawDataFlatFileImporter FAILED    
TestPrintMapFlatFileImporter FAILED   
TestGalExporter FAILED                
TestDirty FAILED                      
TestIlluminaImporter FAILED           
TestGtfImporters FAILED               
TestBasicAnalysis FAILED              
TestReporterCloneTemplate FAILED      
TestIntensityCalculatorPlugin FAILED  
TestLowessNormalization FAILED        
TestMedianRatioNormalization FAILED   
TestBaseFileExporterImporter FAILED   
TestBfsExporterImporter FAILED        
TestBase1PluginExecuter FAILED        
TestExternalProgramExecutor FAILED    
++29 tests failed!                    
++78 tests succeeded!                 

comment:9 Changed 2 months ago by nicklas

I have now compared the databases generated with Hibernate 5.0 and Hibernate 5.2. They are identical!

comment:10 Changed 2 months ago by nicklas

(In [7368]) References #2084: Upgrade to Hibernate 5.2

Hibernate is throwing different exception now which caused some of our error handling code to failed (eg. detecting duplicates in the database). Trying to get back as much of the old behaviour as possible. This fixes a few failed tests:

TestReporter FAILED
TestReporterList FAILED
TestArrayDesign FAILED
TestRawBioAssay FAILED
TestSpotImages FAILED
TestDbControl FAILED
TestItemImporter FAILED
TestReporterFlatFileImporter FAILED
TestReporterMapFlatFileImporter FAILED
TestPlateFlatFileImporter FAILED
TestRawDataFlatFileImporter FAILED
TestPrintMapFlatFileImporter FAILED
TestGalExporter FAILED
TestDirty FAILED
TestIlluminaImporter FAILED
TestGtfImporters FAILED
TestBasicAnalysis FAILED
TestReporterCloneTemplate FAILED
TestIntensityCalculatorPlugin FAILED
TestLowessNormalization FAILED
TestMedianRatioNormalization FAILED
TestBaseFileExporterImporter FAILED
TestBfsExporterImporter FAILED
TestBase1PluginExecuter FAILED
TestExternalProgramExecutor FAILED
++25 tests failed!
++82 tests succeeded!

comment:11 Changed 2 months ago by nicklas

(In [7369]) References #2084: Upgrade to Hibernate 5.2

Hibernate has changed the ID generation implementation. This caused or batchers to create incorrect SQL for PostgreSQL (not tested with MySQL yet). This fixes most of the remaining tests:

TestDbControl FAILED
++1 tests failed!
++106 tests succeeded!

comment:12 Changed 2 months ago by nicklas

The failure in the DbControl test is in the DbControl.disconnect() method. It turns out we are using a Hibernate API in a way that it was not intended to be used. From the Hibernate API:

It is considered an error to call this method on a session which 
was not opened by supplying the JDBC connection and an exception 
will be thrown. 

Ok, we are not getting any exception but it seems that we are now losing changes made to items during the time the DbControl was not connected. As far as I can tell, we only use this feature in the file upload (there is no need to keep the database connection open during the file upload).

I think we should deprecate the DbControl.disconnect() and DbControl.reconnect() methods since there is no way to implement what we want in a generic way. The implementation should be changed to simply not doing anything at all.

Client code that need to disconnect/reconnect should be updated to handle this by using two separate DbControl instances.

comment:13 Changed 2 months ago by nicklas

(In [7370]) References #2084: Upgrade to Hibernate 5.2

The disconnect()/reconnect() methods are now no-op and deprecated. Removed the test case. All tests are now working. Remains to fix the file upload code.

comment:14 Changed 2 months ago by nicklas

(In [7371]) References #2084: Upgrade to Hibernate 5.2

Started to replace org.hibernate.Query with org.hibernate.query.Query in the remaining code. Compilation errors up again to 306 and warnings to 1198.

comment:15 Changed 2 months ago by nicklas

(In [7372]) References #2084: Upgrade to Hibernate 5.2

A global search/replace of org.hibernate.Query with org.hibernate.query.Query. Down to 140 compilation errors but warnings up to 1311 (probably because we are missing a type-parameter for the Query).

comment:16 Changed 2 months ago by nicklas

(In [7373]) References #2084: Upgrade to Hibernate 5.2

Fixed compilation errors related to not using return type parameter on org.hibernate.query.Query. All compilation errors gone, but 1163 warnings remaining.

comment:17 Changed 2 months ago by nicklas

(In [7374]) References #2084: Upgrade to Hibernate 5.2

Replaced calls to Query.setInteger() and other type-specific methods to Query.setParameter() and specified return-type parameter for many queries. Number of warnings down to 556.

comment:18 Changed 2 months ago by nicklas

(In [7375]) References #2084: Upgrade to Hibernate 5.2

Using createNativeQuery() with a return type that is not a defined entity (for example Integer) caused Hibernate to complain. The variant without a return type seems to work though...

comment:19 Changed 2 months ago by nicklas

(In [7376]) References #2084: Upgrade to Hibernate 5.2

Replaced calls to Query.setEntity() with Query.setParameter() and specified return-type parameter for many queries. Number of warnings down to 185.

comment:20 Changed 2 months ago by nicklas

(In [7377]) References #2084: Upgrade to Hibernate 5.2

Fixed all remaining queries without a return type parameter. Number of warnings down to 13.

Last edited 2 months ago by nicklas (previous) (diff)

comment:21 Changed 2 months ago by nicklas

(In [7378]) References #2084: Upgrade to Hibernate 5.2

Getting rid of some more calls to deprecated method. Most have simple replacements, but the various NativeQuery.addXXXX() are a bit more complicated. Lycklily we can either replace them with a Object[] return type or by re-adding the possibility to speify a return type (as long as it matches a defined entity). See [7375]. A new test case in TestReporterCloneTemplate was added to check that this works.

comment:22 Changed 2 months ago by nicklas

(In [7379]) References #2084: Upgrade to Hibernate 5.2

Cleaning out some more query-related stuff.

comment:23 Changed 2 months ago by nicklas

(In [7380]) References #2084: Upgrade to Hibernate 5.2

comment:24 Changed 2 months ago by nicklas

(In [7381]) References #2084: Upgrade to Hibernate 5.2

Merged development branch back to trunk since it seems to be working now.

comment:25 Changed 2 months ago by nicklas

  • Resolution set to fixed
  • Status changed from assigned to closed

comment:26 Changed 7 weeks ago by nicklas

  • Resolution fixed deleted
  • Status changed from closed to reopened

Database schema update is not working when adding a column to an existing table. The generated SQL statement has no quotes around the table which is causing an exception.

org.postgresql.util.PSQLException: ERROR: relation "public.news" does not exist
	at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2412)
	at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2125)
	at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:297)
	at org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:428)
	at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:354)
	at org.postgresql.jdbc.PgStatement.executeWithFlags(PgStatement.java:301)
	at org.postgresql.jdbc.PgStatement.executeCachedSql(PgStatement.java:287)
	at org.postgresql.jdbc.PgStatement.executeWithFlags(PgStatement.java:264)
	at org.postgresql.jdbc.PgStatement.executeUpdate(PgStatement.java:244)
	at com.mchange.v2.c3p0.impl.NewProxyStatement.executeUpdate(NewProxyStatement.java:410)
	at net.sf.basedb.core.hibernate.SchemaGenerator.execute(SchemaGenerator.java:173)
	at org.hibernate.jdbc.WorkExecutor.executeWork(WorkExecutor.java:37)
	at org.hibernate.internal.SessionImpl$1.accept(SessionImpl.java:2321)
	at org.hibernate.internal.SessionImpl$1.accept(SessionImpl.java:2318)
	at org.hibernate.engine.jdbc.internal.JdbcCoordinatorImpl.coordinateWork(JdbcCoordinatorImpl.java:314)
	at org.hibernate.internal.SessionImpl.doWork(SessionImpl.java:2340)
	at org.hibernate.internal.SessionImpl.doWork(SessionImpl.java:2325)
	at net.sf.basedb.core.HibernateUtil.createStaticTables(HibernateUtil.java:769)
	at net.sf.basedb.core.Install.createTables(Install.java:139)
	at net.sf.basedb.install.InitDB.main(InitDB.java:75)

comment:27 Changed 7 weeks ago by nicklas

(In [7391]) References #2084: Upgrade to Hibernate 5.2

Implemented a workaround for the unquoted table name problem. It is a bit of a "hack" that involves replacing a private and final variable inside a Hibernate class with our own implementation that forces names to be quoted. We do this only when doing a database schema update and revert to the original value afterwards.

comment:28 Changed 6 weeks ago by nicklas

(In [7396]) References #2084: Upgrade to Hibernate 5.2

Need to begin a transaction when creating a new piggy-backed session or Hibernate will complain about no active transaction when trying to commit.

Note: See TracTickets for help on using tickets.