Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Where did Configuration.generateSchemaCreationScript() go in Hibernate 5

In Hibernate 4.x, I used to generate and export the schema as defined in annotated entities as follows (using Spring to find annotated entities on the class path):

Connection connection =      DriverManager.getConnection("jdbc:h2:mem:jooq-meta-extensions", "sa", "");  Configuration configuration = new Configuration()     .setProperty("hibernate.dialect", "org.hibernate.dialect.H2Dialect");  // [...] adding annotated classes to Configuration here...  configuration.generateSchemaCreationScript(     Dialect.getDialect(configuration.getProperties())); SchemaExport export = new SchemaExport(configuration, connection); export.create(true, true); 

This no longer works in Hibernate 5.0:

  • Configuration.generateSchemaCreationScript() no longer exists
  • The SchemaExport(configuration, connection) constructor is now deprecated

I didn't really find any obvious references to this change in the migration guide apart from:

Quite a few methods have been removed from Configuration

What is the correct way to generate and export a database on an existing JDBC connection with Hibernate 5.0 based on a set of annotated entities? (Pure JPA-based solutions are fine, too)

(note, just removing the call to generateSchemaCreationScript() seems to work, but I would prefer to be sure to get this right)

like image 575
Lukas Eder Avatar asked Aug 24 '15 08:08

Lukas Eder


1 Answers

Thanks to the answers by Vlad and Gunnar, I've managed to find my way through the new configuration API to produce the equivalent export logic with the following. Of course, history shows that this API will break again, so make sure to choose the appropriate version:

Hibernate 5.2:

MetadataSources metadata = new MetadataSources(     new StandardServiceRegistryBuilder()         .applySetting("hibernate.dialect", "org.hibernate.dialect.H2Dialect")         .applySetting("javax.persistence.schema-generation-connection", connection)         .build());  // [...] adding annotated classes to metadata here... metadata.addAnnotatedClass(...);  SchemaExport export = new SchemaExport(); export.create(EnumSet.of(TargetType.DATABASE), metadata.buildMetadata()); 

Hibernate 5.2 (without warnings):

The above will produce some nasty warnings, which can either be ignored:

Okt 20, 2016 2:57:16 PM org.hibernate.engine.jdbc.connections.internal.ConnectionProviderInitiator initiateService
WARN: HHH000181: No appropriate connection provider encountered, assuming application will be supplying connections
Okt 20, 2016 2:57:16 PM org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator initiateService
WARN: HHH000342: Could not obtain connection to query metadata : The application must supply JDBC connections

... or you work around them by hacking the following ConnectionProvider into the settings (it shouldn't be required in my opinion)

        .applySetting(AvailableSettings.CONNECTION_PROVIDER, new ConnectionProvider() {             @Override             public boolean isUnwrappableAs(Class unwrapType) {                 return false;             }             @Override             public <T> T unwrap(Class<T> unwrapType) {                 return null;             }             @Override             public Connection getConnection() {                 return connection; // Interesting part here             }             @Override             public void closeConnection(Connection conn) throws SQLException {}              @Override             public boolean supportsAggressiveRelease() {                 return true;             }         }) 

Hibernate 5.0:

MetadataSources metadata = new MetadataSources(     new StandardServiceRegistryBuilder()         .applySetting("hibernate.dialect", "org.hibernate.dialect.H2Dialect")         .build());  // [...] adding annotated classes to metadata here... metadata.addAnnotatedClass(...);  SchemaExport export = new SchemaExport(     (MetadataImplementor) metadata.buildMetadata(),     connection // pre-configured Connection here ); export.create(true, true); 

Hibernate 4:

As a reminder, here's how this worked in Hibernate 4:

Configuration configuration = new Configuration()     .setProperty("hibernate.dialect", "org.hibernate.dialect.H2Dialect");  // [...] adding annotated classes to metadata here... configuration.addAnnotatedClass(...);  configuration.generateSchemaCreationScript(     Dialect.getDialect(configuration.getProperties())); SchemaExport export = new SchemaExport(configuration, connection); export.create(true, true); 
like image 167
Lukas Eder Avatar answered Oct 20 '22 06:10

Lukas Eder