-
Notifications
You must be signed in to change notification settings - Fork 154
Commit
- Loading branch information
There are no files selected for viewing
This file was deleted.
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,71 +1,72 @@ | ||
package liquibase.ext.hibernate.database; | ||
|
||
import liquibase.database.DatabaseConnection; | ||
import liquibase.database.OfflineConnection; | ||
import liquibase.exception.DatabaseException; | ||
import liquibase.ext.hibernate.customfactory.CustomClassicConfigurationFactory; | ||
import liquibase.ext.hibernate.database.connection.HibernateConnection; | ||
import org.hibernate.SessionFactory; | ||
import org.hibernate.boot.Metadata; | ||
import org.hibernate.boot.MetadataBuilder; | ||
import org.hibernate.boot.MetadataSources; | ||
import org.hibernate.boot.SessionFactoryBuilder; | ||
import org.hibernate.boot.registry.BootstrapServiceRegistry; | ||
import org.hibernate.boot.registry.StandardServiceRegistry; | ||
import org.hibernate.boot.registry.StandardServiceRegistryBuilder; | ||
import org.hibernate.cfg.AvailableSettings; | ||
import org.hibernate.cfg.Configuration; | ||
import org.hibernate.cfg.NamingStrategy; | ||
import org.hibernate.dialect.Dialect; | ||
import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider; | ||
import org.hibernate.engine.jdbc.connections.spi.MultiTenantConnectionProvider; | ||
import org.hibernate.service.ServiceRegistry; | ||
|
||
import java.lang.reflect.Field; | ||
import java.util.HashMap; | ||
import java.util.Properties; | ||
|
||
/** | ||
* Database implementation for "classic" hibernate configurations. | ||
* This supports passing a hibernate xml configuration file or a {@link CustomClassicConfigurationFactory} implementation | ||
*/ | ||
public class HibernateClassicDatabase extends HibernateDatabase { | ||
|
||
protected Configuration configuration; | ||
|
||
public boolean isCorrectDatabaseImplementation(DatabaseConnection conn) throws DatabaseException { | ||
return conn.getURL().startsWith("hibernate:classic:"); | ||
} | ||
|
||
@Override | ||
protected Configuration buildConfiguration(HibernateConnection connection) throws DatabaseException { | ||
protected String findDialectName() { | ||
String dialectName = super.findDialectName(); | ||
|
||
if (isCustomFactoryClass(connection.getPath())) { | ||
return buildConfigurationFromFactory(connection); | ||
} else { | ||
return buildConfigurationfromFile(connection); | ||
if (dialectName == null) { | ||
dialectName = configuration.getProperty(AvailableSettings.DIALECT); | ||
} | ||
return dialectName; | ||
} | ||
|
||
/** | ||
* Build a Configuration object assuming the connection path is a {@link CustomClassicConfigurationFactory} class name | ||
*/ | ||
protected Configuration buildConfigurationFromFactory(HibernateConnection connection) throws DatabaseException { | ||
try { | ||
return ((CustomClassicConfigurationFactory) Class.forName(connection.getPath()).newInstance()).getConfiguration(this, connection); | ||
} catch (InstantiationException e) { | ||
throw new DatabaseException(e); | ||
} catch (IllegalAccessException e) { | ||
throw new DatabaseException(e); | ||
} catch (ClassNotFoundException e) { | ||
throw new DatabaseException(e); | ||
} | ||
} | ||
|
||
/** | ||
* Build a Configuration object assuming the connection path is a hibernate XML configuration file. | ||
*/ | ||
protected Configuration buildConfigurationfromFile(HibernateConnection connection) { | ||
Configuration configuration = new Configuration(); | ||
configuration.configure(connection.getPath()); | ||
configureNamingStrategy(configuration, connection); | ||
return configuration; | ||
protected Metadata generateMetadata() throws DatabaseException { | ||
this.configuration = new Configuration(); | ||
this.configuration.configure(getHibernateConnection().getPath()); | ||
|
||
return super.generateMetadata(); | ||
} | ||
|
||
/** | ||
* Returns true if the given path is a factory class | ||
*/ | ||
protected boolean isCustomFactoryClass(String path) { | ||
if (path.contains("/")) { | ||
return false; | ||
} | ||
@Override | ||
protected void addToSources(MetadataSources sources) throws DatabaseException { | ||
Configuration config = new Configuration(sources); | ||
config.configure(getHibernateConnection().getPath()); | ||
|
||
try { | ||
Class<?> clazz = Class.forName(path); | ||
return CustomClassicConfigurationFactory.class.isAssignableFrom(clazz); | ||
} catch (ClassNotFoundException e) { | ||
return false; | ||
} | ||
config.setProperty("hibernate.temp.use_jdbc_metadata_defaults", "false"); | ||
This comment has been minimized.
Sorry, something went wrong.
This comment has been minimized.
Sorry, something went wrong.
filipelautert
Collaborator
|
||
|
||
|
||
ServiceRegistry standardRegistry = configuration.getStandardServiceRegistryBuilder() | ||
.applySettings(config.getProperties()) | ||
.addService(ConnectionProvider.class, new NoOpConnectionProvider()) | ||
.addService(MultiTenantConnectionProvider.class, new NoOpConnectionProvider()) | ||
.build(); | ||
|
||
config.buildSessionFactory(standardRegistry); | ||
} | ||
|
||
@Override | ||
|
@@ -79,5 +80,4 @@ protected String getDefaultDatabaseProductName() { | |
} | ||
|
||
|
||
|
||
} |
hi @nvoxland do you remember why you set this only for HibernateClassicDatabase? It seems needed for other cases as well (for example but not limited to HibernateSpringPackageDatabase, see #431 ) (and variants : #482 #481 # 381 ...) ?
maybe add the same line " config.setProperty("hibernate.temp.use_jdbc_metadata_defaults", "false");" to HibernateSpringPackageDatabase or maybe Ejb3Database so that all children classes using createEntityManagerFactoryBuilder benefit from it ?
(see
https://docs.jboss.org/hibernate/orm/5.6/userguide/html_single/Hibernate_User_Guide.html#configurations-internal
https://docs.jboss.org/hibernate/orm/6.1/userguide/html_single/Hibernate_User_Guide.html#configurations-internal
Note: no longer documented in hibernate 6.2/6.3 after the switch to documentation generated from AvailableSettings.java (hibernate/hibernate-orm@fd961cebb10 ) which doesn't have it
)
Or just catch the exception to avoid confusing users ?
maybe @filipelautert , @papegaaij, @DanielFran can chime in as well ?