branch feature/4062 created (now 0864e07)
This is an automated email from the git hooks/post-receive script. New change to branch feature/4062 in repository topia. See https://gitlab.nuiton.org/nuiton/topia.git at 0864e07 Update to hibernate 5.2.3 This branch includes the following new commits: new 0864e07 Update to hibernate 5.2.3 The 1 revisions listed above as "new" are entirely new to this repository and will be described in separate emails. The revisions listed as "adds" were already present in the repository and have only been added to this reference. Detailed log of new commits: commit 0864e07f3ae77c7c09810ea0a5027fc05aee2b3a Author: Tony CHEMIT <chemit@codelutin.com> Date: Sat Oct 8 10:17:56 2016 +0200 Update to hibernate 5.2.3 -- To stop receiving notification emails like this one, please contact nuiton.org SCM administrator <admin+scm@nuiton.org>.
This is an automated email from the git hooks/post-receive script. New commit to branch feature/4062 in repository topia. See https://gitlab.nuiton.org/nuiton/topia.git commit 0864e07f3ae77c7c09810ea0a5027fc05aee2b3a Author: Tony CHEMIT <chemit@codelutin.com> Date: Sat Oct 8 10:17:56 2016 +0200 Update to hibernate 5.2.3 --- pom.xml | 2 +- .../topia/it/legacy/persistence/NaturalIdTest.java | 5 +- .../internal/AbstractTopiaApplicationContext.java | 71 ++++----- .../internal/AbstractTopiaPersistenceContext.java | 38 ++++- .../persistence/internal/HibernateProvider.java | 64 +++++++- .../persistence/support/TopiaHibernateSupport.java | 6 + .../nuiton/topia/persistence/util/TopiaUtil.java | 177 ++++++++------------- .../topia/migration/TopiaMigrationEngine.java | 22 +-- .../migration/mappings/TMSVersionHibernateDao.java | 23 ++- 9 files changed, 229 insertions(+), 179 deletions(-) diff --git a/pom.xml b/pom.xml index f63c762..1fc476a 100644 --- a/pom.xml +++ b/pom.xml @@ -226,7 +226,7 @@ <h2Version>1.3.176</h2Version> <hamcrestVersion>1.3</hamcrestVersion> - <hibernateVersion>4.3.11.Final</hibernateVersion> + <hibernateVersion>5.2.3.Final</hibernateVersion> <javassistVersion>3.20.0-GA</javassistVersion> <junitVersion>4.12</junitVersion> <liquibaseVersion>3.5.0</liquibaseVersion> diff --git a/topia-it/src/test/java/org/nuiton/topia/it/legacy/persistence/NaturalIdTest.java b/topia-it/src/test/java/org/nuiton/topia/it/legacy/persistence/NaturalIdTest.java index e30192e..6a90910 100644 --- a/topia-it/src/test/java/org/nuiton/topia/it/legacy/persistence/NaturalIdTest.java +++ b/topia-it/src/test/java/org/nuiton/topia/it/legacy/persistence/NaturalIdTest.java @@ -37,6 +37,8 @@ import org.nuiton.topia.it.legacy.TopiaItLegacyTopiaPersistenceContext; import org.nuiton.topia.it.legacy.topiatest.NaturalizedEntity; import org.nuiton.topia.it.legacy.topiatest.NaturalizedEntityTopiaDao; +import javax.persistence.PersistenceException; + /** * NaturalIdTest * @@ -115,8 +117,7 @@ public class NaturalIdTest { entity.setNaturalIdNotNull(8); persistenceContext.commit(); } catch (TopiaException eee) { - Assert.assertEquals("org.hibernate.HibernateException", - eee.getCause().getClass().getName()); + Assert.assertEquals(PersistenceException.class, eee.getCause().getClass()); } } diff --git a/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/AbstractTopiaApplicationContext.java b/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/AbstractTopiaApplicationContext.java index e2d1346..66c2960 100644 --- a/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/AbstractTopiaApplicationContext.java +++ b/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/AbstractTopiaApplicationContext.java @@ -31,10 +31,13 @@ import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.hibernate.HibernateException; +import org.hibernate.boot.Metadata; +import org.hibernate.cfg.AvailableSettings; import org.hibernate.cfg.Configuration; import org.hibernate.mapping.PersistentClass; import org.hibernate.tool.hbm2ddl.SchemaExport; import org.hibernate.tool.hbm2ddl.SchemaUpdate; +import org.hibernate.tool.schema.TargetType; import org.nuiton.topia.persistence.TopiaApplicationContext; import org.nuiton.topia.persistence.TopiaApplicationContextCache; import org.nuiton.topia.persistence.TopiaConfiguration; @@ -60,7 +63,7 @@ import java.beans.PropertyChangeListener; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; -import java.util.Iterator; +import java.util.EnumSet; import java.util.List; import java.util.Map; import java.util.Properties; @@ -162,8 +165,8 @@ public abstract class AbstractTopiaApplicationContext<K extends TopiaPersistence * * This simple check is in its own method so it can be overridden. * - * @see org.nuiton.topia.persistence.TopiaConfiguration#isInitSchema() * @return FIXME + * @see org.nuiton.topia.persistence.TopiaConfiguration#isInitSchema() */ protected boolean isInitSchema() { boolean initSchema = configuration.isInitSchema(); @@ -359,8 +362,10 @@ public abstract class AbstractTopiaApplicationContext<K extends TopiaPersistence @Override public boolean isSchemaEmpty() { // AThimel 14/06/14 getHibernateConfiguration() may create the schema, prefer using newHibernateConfiguration() which doesn't - Configuration configuration = getHibernateProvider().getHibernateConfiguration(); - boolean result = TopiaUtil.isSchemaEmpty(configuration); + Configuration configuration = getHibernateProvider().newHibernateConfiguration(); + configuration.getProperties().put(AvailableSettings.HBM2DDL_AUTO, "none"); + Metadata metaData = getHibernateProvider().newMetaData(configuration); + boolean result = TopiaUtil.isSchemaEmpty(configuration, metaData); return result; } @@ -368,7 +373,8 @@ public abstract class AbstractTopiaApplicationContext<K extends TopiaPersistence public boolean isTableExists(Class<?> clazz) { // AThimel 14/06/14 getHibernateConfiguration() may create the schema, prefer using newHibernateConfiguration() which doesn't Configuration configuration = getHibernateProvider().getHibernateConfiguration(); - boolean result = TopiaUtil.isSchemaExist(configuration, clazz.getName()); + Metadata metaData = getHibernateProvider().getMetaData(); + boolean result = TopiaUtil.isSchemaExist(configuration, metaData, clazz.getName()); return result; } @@ -381,31 +387,27 @@ public abstract class AbstractTopiaApplicationContext<K extends TopiaPersistence @Override public void createSchema() { try { - boolean showSchema = false; + EnumSet<TargetType> targetTypes = EnumSet.of(TargetType.DATABASE); if (log.isDebugEnabled()) { - showSchema = true; + targetTypes.add(TargetType.STDOUT); } topiaFiresSupport.firePreCreateSchema(this); - Configuration hibernateConfiguration = getHibernateProvider().getHibernateConfiguration(); - new SchemaExport(hibernateConfiguration).execute(showSchema, true, false, true); + Configuration configuration = getHibernateProvider().newHibernateConfiguration(); + configuration.getProperties().remove(AvailableSettings.HBM2DDL_AUTO); + Metadata metadata = getHibernateProvider().newMetaData(configuration); + new SchemaExport().execute(targetTypes, SchemaExport.Action.CREATE, metadata); topiaFiresSupport.firePostCreateSchema(this); } catch (HibernateException eee) { - throw new TopiaException( - String.format("Could not create schema for reason: %s", - eee.getMessage()), eee); + throw new TopiaException(String.format("Could not create schema for reason: %s", eee.getMessage()), eee); } } @Override public void showCreateSchema() { try { - // AThimel 14/06/14 getHibernateConfiguration() may create the schema, prefer using newHibernateConfiguration() which doesn't - Configuration hibernateConfiguration = getHibernateProvider().getHibernateConfiguration(); - new SchemaExport(hibernateConfiguration).execute(true, false, false, true); + new SchemaExport().execute(EnumSet.of(TargetType.DATABASE, TargetType.STDOUT), SchemaExport.Action.CREATE, getHibernateProvider().getMetaData()); } catch (HibernateException eee) { - throw new TopiaException( - String.format("Could not show create schema for reason: %s", - eee.getMessage()), eee); + throw new TopiaException(String.format("Could not show create schema for reason: %s", eee.getMessage()), eee); } } @@ -413,40 +415,30 @@ public abstract class AbstractTopiaApplicationContext<K extends TopiaPersistence @Override public void updateSchema() { try { - boolean showSchema = false; + EnumSet<TargetType> targetTypes = EnumSet.of(TargetType.DATABASE); if (log.isDebugEnabled()) { - showSchema = true; + targetTypes.add(TargetType.STDOUT); } - topiaFiresSupport.firePreUpdateSchema(this); - // AThimel 14/06/14 getHibernateConfiguration() may create the schema, prefer using newHibernateConfiguration() which doesn't - Configuration hibernateConfiguration = getHibernateProvider().getHibernateConfiguration(); - new SchemaUpdate(hibernateConfiguration).execute(showSchema, true); + new SchemaUpdate().execute(targetTypes, getHibernateProvider().getMetaData()); topiaFiresSupport.firePostUpdateSchema(this); } catch (HibernateException eee) { - throw new TopiaException( - String.format("Could not update schema for reason: %s", - eee.getMessage()), eee); + throw new TopiaException(String.format("Could not update schema for reason: %s", eee.getMessage()), eee); } } @Override public void dropSchema() { try { - boolean showSchema = false; + EnumSet<TargetType> targetTypes = EnumSet.of(TargetType.DATABASE); if (log.isDebugEnabled()) { - showSchema = true; + targetTypes.add(TargetType.STDOUT); } - topiaFiresSupport.firePreDropSchema(this); - // AThimel 14/06/14 getHibernateConfiguration() may create the schema, prefer using newHibernateConfiguration() which doesn't - Configuration hibernateConfiguration = getHibernateProvider().getHibernateConfiguration(); - new SchemaExport(hibernateConfiguration).execute(showSchema, true, true, false); + new SchemaExport().execute(targetTypes, SchemaExport.Action.DROP, getHibernateProvider().getMetaData()); topiaFiresSupport.firePostDropSchema(this); } catch (HibernateException eee) { - throw new TopiaException( - String.format("Could not drop schema for reason: %s", - eee.getMessage()), eee); + throw new TopiaException(String.format("Could not drop schema for reason: %s", eee.getMessage()), eee); } } @@ -501,10 +493,9 @@ public abstract class AbstractTopiaApplicationContext<K extends TopiaPersistence @Override public ImmutableSet<String> getSchemaNames() { - ImmutableSet.Builder <String> result = ImmutableSet.builder(); - Iterator<PersistentClass> classMappings = hibernateProvider.getHibernateConfiguration().getClassMappings(); - while (classMappings.hasNext()) { - PersistentClass persistentClass = classMappings.next(); + ImmutableSet.Builder<String> result = ImmutableSet.builder(); + Collection<PersistentClass> classMappings = hibernateProvider.getMetaData().getEntityBindings(); + for (PersistentClass persistentClass : classMappings) { String schema = persistentClass.getIdentityTable().getSchema(); if (StringUtils.isNotEmpty(schema)) { result.add(schema); diff --git a/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/AbstractTopiaPersistenceContext.java b/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/AbstractTopiaPersistenceContext.java index 9124dd8..fb944dd 100644 --- a/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/AbstractTopiaPersistenceContext.java +++ b/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/AbstractTopiaPersistenceContext.java @@ -33,6 +33,7 @@ import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; +import org.hibernate.boot.Metadata; import org.hibernate.cfg.Configuration; import org.nuiton.topia.persistence.TopiaDao; import org.nuiton.topia.persistence.TopiaEntity; @@ -177,6 +178,11 @@ public abstract class AbstractTopiaPersistenceContext implements TopiaPersistenc } @Override + public Metadata getHibernateMetadata() { + return hibernateProvider.getMetaData(); + } + + @Override public Configuration getHibernateConfiguration() { return hibernateProvider.getHibernateConfiguration(); } @@ -272,13 +278,37 @@ public abstract class AbstractTopiaPersistenceContext implements TopiaPersistenc SessionFactory hibernateFactory = hibernateSupport.getHibernateFactory(); Preconditions.checkState(hibernateFactory != null, "The Hibernate SessionFactory is null, please initialize"); - if (hibernateFactory.getClassMetadata(entityClass) == null && - hibernateFactory.getClassMetadata(entityClass.getName() + "Impl") == null && - hibernateFactory.getClassMetadata(entityClass.getName() + "Abstract") == null) { + + boolean found = false; + try { + hibernateFactory.getMetamodel().entity(entityClass); + found = true; + } catch (Exception e) { + } + if (!found) { + try { + hibernateFactory.getMetamodel().entity(entityClass.getName() + "Impl"); + found = true; + } catch (Exception e) { + } + } + if (!found) { + try { + hibernateFactory.getMetamodel().entity(entityClass.getName() + "Abstract"); + found = true; + } catch (Exception e) { + } + } + +// if (hibernateFactory.getMetamodel().entity(entityClass) == null && +// hibernateFactory.getMetamodel().entity(entityClass.getName() + "Impl") == null && +// hibernateFactory.getMetamodel().entity(entityClass.getName() + "Abstract") == null) + + if (! found) { if (log.isInfoEnabled()) { String format = "List of supported persistence classes: %s"; - String message = String.format(format, hibernateFactory.getAllClassMetadata().keySet()); + String message = String.format(format, hibernateFactory.getMetamodel().getEntities()); log.info(message); } String format = "The following entity type %s is not managed by this context, you probably forgot to declare it."; diff --git a/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/HibernateProvider.java b/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/HibernateProvider.java index b875769..faf2574 100644 --- a/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/HibernateProvider.java +++ b/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/HibernateProvider.java @@ -28,7 +28,11 @@ import com.google.common.base.Preconditions; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.hibernate.SessionFactory; +import org.hibernate.boot.Metadata; +import org.hibernate.boot.MetadataBuilder; +import org.hibernate.boot.MetadataSources; import org.hibernate.boot.registry.StandardServiceRegistry; +import org.hibernate.boot.spi.SessionFactoryOptions; import org.hibernate.cfg.AvailableSettings; import org.hibernate.cfg.Configuration; import org.hibernate.dialect.DB2Dialect; @@ -56,6 +60,7 @@ import org.nuiton.topia.persistence.jdbc.JdbcConfigurationBuilder; import org.nuiton.topia.persistence.support.TopiaServiceSupport; import org.nuiton.topia.persistence.util.TopiaUtil; +import java.util.Collection; import java.util.Properties; import java.util.Set; @@ -75,12 +80,13 @@ public class HibernateProvider { protected TopiaServiceSupport topiaServiceSupport; protected TopiaHibernateSessionRegistry sessionRegistry; - /** * List of persistent classes */ protected Set<Class<? extends TopiaEntity>> entityClasses; + protected Metadata metaData; + public HibernateProvider(TopiaConfiguration topiaConfiguration, TopiaServiceSupport topiaServiceSupport, TopiaHibernateSessionRegistry sessionRegistry, @@ -102,9 +108,6 @@ public class HibernateProvider { hibernateConfiguration = newHibernateConfiguration(); TopiaUtil.warnOnAutomaticSchemaOperationRisk(hibernateConfiguration); - - // tchemit 2011-05-26 When using hibernate > 3.3, need to make sure all mappings are loaded (the one from directory files are not still done). - hibernateConfiguration.buildMappings(); } return hibernateConfiguration; } @@ -167,6 +170,7 @@ public class HibernateProvider { * * Prefer user defined dialect over dialect guessed by ToPIA; * Warn user if dialect declared seems wrong (H2 dialect for a PostgreSQL database) + * * @throws TopiaMisconfigurationException if user must add dialect to its configuration (because it can not be guessed) */ public static String getHibernateDialect(TopiaConfiguration topiaConfiguration) { @@ -274,10 +278,10 @@ public class HibernateProvider { * @param sessionFactory the Hibernate's SessionFactory instance * @return the StandardServiceRegistry instance used by the given SessionFactory */ - protected static StandardServiceRegistry getStandardServiceRegistry(SessionFactory sessionFactory) { + public static StandardServiceRegistry getStandardServiceRegistry(SessionFactory sessionFactory) { // AThimel 03/04/14 The next two lines are the good way to get the StandardServiceRegistry in Hibernate 4.3 - SessionFactory.SessionFactoryOptions sessionFactoryOptions = sessionFactory.getSessionFactoryOptions(); + SessionFactoryOptions sessionFactoryOptions = sessionFactory.getSessionFactoryOptions(); StandardServiceRegistry result = sessionFactoryOptions.getServiceRegistry(); return result; @@ -327,6 +331,7 @@ public class HibernateProvider { } public void close() { + metaData = null; if (hibernateSessionFactory != null) { Preconditions.checkState(!hibernateSessionFactory.isClosed()); @@ -367,4 +372,51 @@ public class HibernateProvider { return hibernateSessionFactory; } + public SessionFactory newSessionFactory(Configuration effectiveHibernateConfiguration) { + + hibernateSessionFactory = TopiaUtil.newSessionFactory(effectiveHibernateConfiguration); + + EventListenerRegistry eventListenerRegistry = getHibernateService(hibernateSessionFactory, EventListenerRegistry.class); + + TopiaHibernateEventListener listener = new TopiaHibernateEventListener(sessionRegistry); + eventListenerRegistry.appendListeners(EventType.PRE_INSERT, listener); + eventListenerRegistry.appendListeners(EventType.PRE_LOAD, listener); + eventListenerRegistry.appendListeners(EventType.PRE_UPDATE, listener); + eventListenerRegistry.appendListeners(EventType.PRE_DELETE, listener); + eventListenerRegistry.appendListeners(EventType.POST_INSERT, listener); + eventListenerRegistry.appendListeners(EventType.POST_LOAD, listener); + eventListenerRegistry.appendListeners(EventType.POST_UPDATE, listener); + eventListenerRegistry.appendListeners(EventType.POST_DELETE, listener); + + // following listeners must be called before hibernate + eventListenerRegistry.prependListeners(EventType.SAVE_UPDATE, listener); + + return hibernateSessionFactory; + } + + + public Metadata getMetaData() { + if (metaData == null) { + metaData = newMetaData(getHibernateConfiguration()); + } + return metaData; + } + + public Metadata newMetaData(Configuration configuration) { + return newMetaData(configuration, (Set) entityClasses); + } + + public Metadata newMetaData(Configuration configuration, Collection<Class<?>> entityClasses) { + + StandardServiceRegistry standardServiceRegistry = getStandardServiceRegistry(newSessionFactory(configuration)); + MetadataSources sources = new MetadataSources(standardServiceRegistry); + for (Class<?> persistanceClass : entityClasses) { + String hbmXmlFile = persistanceClass.getName().replace('.', '/') + ".hbm.xml"; + sources.addResource(hbmXmlFile); + } + + MetadataBuilder metadataBuilder = sources.getMetadataBuilder(); + + return metadataBuilder.build(); + } } diff --git a/topia-persistence/src/main/java/org/nuiton/topia/persistence/support/TopiaHibernateSupport.java b/topia-persistence/src/main/java/org/nuiton/topia/persistence/support/TopiaHibernateSupport.java index ff75dc0..280a302 100644 --- a/topia-persistence/src/main/java/org/nuiton/topia/persistence/support/TopiaHibernateSupport.java +++ b/topia-persistence/src/main/java/org/nuiton/topia/persistence/support/TopiaHibernateSupport.java @@ -26,6 +26,7 @@ package org.nuiton.topia.persistence.support; import org.hibernate.Session; import org.hibernate.SessionFactory; +import org.hibernate.boot.Metadata; import org.hibernate.cfg.Configuration; /** @@ -47,6 +48,11 @@ public interface TopiaHibernateSupport { SessionFactory getHibernateFactory(); /** + * @return Returns the Hibernate's Metadata. + */ + Metadata getHibernateMetadata(); + + /** * @return Returns the Hibernate configuration */ Configuration getHibernateConfiguration(); diff --git a/topia-persistence/src/main/java/org/nuiton/topia/persistence/util/TopiaUtil.java b/topia-persistence/src/main/java/org/nuiton/topia/persistence/util/TopiaUtil.java index 3440079..ae2eccd 100644 --- a/topia-persistence/src/main/java/org/nuiton/topia/persistence/util/TopiaUtil.java +++ b/topia-persistence/src/main/java/org/nuiton/topia/persistence/util/TopiaUtil.java @@ -33,6 +33,7 @@ import org.apache.commons.logging.LogFactory; import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.SessionFactory; +import org.hibernate.boot.Metadata; import org.hibernate.boot.registry.StandardServiceRegistry; import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.hibernate.cfg.AvailableSettings; @@ -41,8 +42,6 @@ import org.hibernate.dialect.Dialect; import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider; import org.hibernate.mapping.PersistentClass; import org.hibernate.mapping.Table; -import org.hibernate.tool.hbm2ddl.DatabaseMetadata; -import org.hibernate.tool.hbm2ddl.TableMetadata; import org.nuiton.topia.persistence.SchemaValidationTopiaException; import org.nuiton.topia.persistence.TopiaEntity; import org.nuiton.topia.persistence.TopiaException; @@ -56,9 +55,10 @@ import java.io.Closeable; import java.io.IOException; import java.net.URL; import java.sql.Connection; +import java.sql.ResultSet; import java.sql.SQLException; +import java.util.Collection; import java.util.HashMap; -import java.util.Iterator; import java.util.LinkedHashMap; import java.util.Map; import java.util.Properties; @@ -174,8 +174,7 @@ public class TopiaUtil { * @return <tt>true</tt> si le schema de la table existe * @since 2.6.4 */ - public static boolean isSchemaExist(TopiaHibernateSupport topiaHibernateSupport, - String entityName) { + public static boolean isSchemaExist(TopiaHibernateSupport topiaHibernateSupport, String entityName) { ConnectionProviderSupplier connectionProviderSupplier = new ConnectionProviderSupplier(topiaHibernateSupport); @@ -183,45 +182,38 @@ public class TopiaUtil { try { - Configuration configuration = topiaHibernateSupport.getHibernateConfiguration(); - PersistentClass classMapping = - configuration.getClassMapping(entityName); + Metadata metadata = topiaHibernateSupport.getHibernateMetadata(); + PersistentClass classMapping = metadata.getEntityBinding(entityName); if (classMapping == null) { if (log.isInfoEnabled()) { - Iterator<?> itr = configuration.getClassMappings(); - while (itr.hasNext()) { - log.info("available mapping " + itr.next()); + Collection<PersistentClass> itr = metadata.getEntityBindings(); + for (PersistentClass persistentClass : itr) { + log.info("available mapping " + persistentClass); } } - throw new IllegalArgumentException( - "could not find entity with name " + entityName); + throw new IllegalArgumentException("could not find entity with name " + entityName); } Table testTable = classMapping.getTable(); if (testTable == null) { - throw new IllegalArgumentException( - "could not find entity with name " + entityName); + throw new IllegalArgumentException("could not find entity with name " + entityName); } - ConnectionProvider connectionProvider = - connectionProviderSupplier.get(); - - Dialect dialect = Dialect.getDialect(configuration.getProperties()); + ConnectionProvider connectionProvider = connectionProviderSupplier.get(); Connection connection = null; try { connection = connectionProvider.getConnection(); - DatabaseMetadata meta = new DatabaseMetadata(connection, dialect, configuration); - - TableMetadata tmd = meta.getTableMetadata( - testTable.getName(), testTable.getSchema(), - testTable.getCatalog(), testTable.isQuoted()); - - if (tmd != null) { - //table exist - exist = true; + ResultSet tables = connection.getMetaData().getTables(testTable.getCatalog(), testTable.getSchema(), null, null); + while (tables.next()) { + String currentTableName = tables.getString("TABLE_NAME"); + if (currentTableName.equalsIgnoreCase(testTable.getName())) { + exist = true; + } } + tables.close(); + } finally { connectionProvider.closeConnection(connection); } @@ -249,26 +241,20 @@ public class TopiaUtil { * @param entityName le nom de l'entite a tester * @return <tt>true</tt> si le schema de la table existe */ - public static boolean isSchemaExist(Configuration configuration, - String entityName) { + public static boolean isSchemaExist(Configuration configuration, Metadata metadata, String entityName) { - ConnectionProviderSupplier connectionProviderSupplier = - new ConnectionProviderSupplier(configuration); + ConnectionProviderSupplier connectionProviderSupplier = new ConnectionProviderSupplier(configuration); boolean exist = false; - try { - PersistentClass classMapping = - configuration.getClassMapping(entityName); + PersistentClass classMapping = metadata.getEntityBinding(entityName); if (classMapping == null) { if (log.isInfoEnabled()) { - Iterator<?> itr = configuration.getClassMappings(); - while (itr.hasNext()) { - log.info("available mapping " + itr.next()); + for (PersistentClass persistentClass : metadata.getEntityBindings()) { + log.info("available mapping " + persistentClass.getClassName()); } } - throw new IllegalArgumentException( - "could not find entity with name " + entityName); + throw new IllegalArgumentException("could not find entity with name " + entityName); } Table testTable = classMapping.getTable(); @@ -277,25 +263,21 @@ public class TopiaUtil { "could not find entity with name " + entityName); } - ConnectionProvider connectionProvider = - connectionProviderSupplier.get(); - - Dialect dialect = Dialect.getDialect(configuration.getProperties()); + ConnectionProvider connectionProvider = connectionProviderSupplier.get(); Connection connection = null; try { connection = connectionProvider.getConnection(); - DatabaseMetadata meta = new DatabaseMetadata(connection, dialect, configuration); - - TableMetadata tmd = meta.getTableMetadata( - testTable.getName(), testTable.getSchema(), - testTable.getCatalog(), testTable.isQuoted()); - - if (tmd != null) { - //table exist - exist = true; + ResultSet tables = connection.getMetaData().getTables(testTable.getCatalog(), testTable.getSchema(), null, null); + while (tables.next()) { + String currentTableName = tables.getString("TABLE_NAME"); + if (currentTableName.equalsIgnoreCase(testTable.getName())) { + exist = true; + } } + tables.close(); + } finally { connectionProvider.closeConnection(connection); } @@ -330,11 +312,12 @@ public class TopiaUtil { * the dealed entities. * * @param configuration hibernate db configuration + * @param metaData hibernate metadata * @return {@code true} if there is no schema for any of the dealed entities, * {@code false} otherwise. * @since 2.5.3 */ - public static boolean isSchemaEmpty(Configuration configuration) { + public static boolean isSchemaEmpty(Configuration configuration, Metadata metaData) { warnOnAutomaticSchemaOperationRisk(configuration); @@ -344,43 +327,28 @@ public class TopiaUtil { ConnectionProvider connectionProvider = connectionProviderSupplier.get(); - Dialect dialect = Dialect.getDialect(configuration.getProperties()); - Connection connection = null; try { connection = connectionProvider.getConnection(); - DatabaseMetadata meta = new DatabaseMetadata(connection, dialect, configuration); - - Iterator<?> itr = configuration.getClassMappings(); - while (itr.hasNext()) { - PersistentClass classMapping = (PersistentClass) itr.next(); - Table testTable = classMapping.getTable(); - - if (testTable == null) { - throw new IllegalArgumentException( - "could not find entity with name " + - classMapping.getClassName()); - } - + for (PersistentClass persistentClass : metaData.getEntityBindings()) { - TableMetadata tmd = meta.getTableMetadata( - testTable.getName(), testTable.getSchema(), - testTable.getCatalog(), testTable.isQuoted()); + Table testTable = persistentClass.getTable(); - if (tmd != null) { - //table exist + ResultSet tables = connection.getMetaData().getTables(testTable.getCatalog(), testTable.getSchema(), null, null); + while (tables.next()) { + String currentTableName = tables.getString("TABLE_NAME"); + log.trace("Scan table: " + currentTableName); + if (currentTableName.equalsIgnoreCase(testTable.getName())) { + if (log.isDebugEnabled()) { + log.debug("Existing table found " + testTable.getName() + " for entity " + + persistentClass.getClassName() + ", db is not empty."); + } - - if (log.isDebugEnabled()) { - log.debug("Existing table found " + - testTable.getName() + " for entity " + - classMapping.getClassName() + - ", db is not empty."); + return false; } - - return false; } + tables.close(); } } finally { @@ -414,48 +382,35 @@ public class TopiaUtil { ConnectionProviderSupplier connectionProviderSupplier = new ConnectionProviderSupplier(topiaHibernateSupport); Configuration configuration = topiaHibernateSupport.getHibernateConfiguration(); + Metadata metadata = topiaHibernateSupport.getHibernateMetadata(); try { - ConnectionProvider connectionProvider = - connectionProviderSupplier.get(); - - Dialect dialect = Dialect.getDialect(configuration.getProperties()); + ConnectionProvider connectionProvider = connectionProviderSupplier.get(); Connection connection = null; try { connection = connectionProvider.getConnection(); - DatabaseMetadata meta = new DatabaseMetadata(connection, dialect, configuration); - Iterator<?> itr = configuration.getClassMappings(); - while (itr.hasNext()) { - PersistentClass classMapping = (PersistentClass) itr.next(); - Table testTable = classMapping.getTable(); - - if (testTable == null) { - throw new IllegalArgumentException( - "could not find entity with name " + - classMapping.getClassName()); - } + for (PersistentClass persistentClass : metadata .getEntityBindings()) { + Table testTable = persistentClass.getTable(); - TableMetadata tmd = meta.getTableMetadata( - testTable.getName(), testTable.getSchema(), - testTable.getCatalog(), testTable.isQuoted()); + ResultSet tables = connection.getMetaData().getTables(testTable.getCatalog(), testTable.getSchema(), null, null); + while (tables.next()) { + String currentTableName = tables.getString("TABLE_NAME"); + log.trace("Scan table: " + currentTableName); + if (currentTableName.equalsIgnoreCase(testTable.getName())) { + if (log.isDebugEnabled()) { + log.debug("Existing table found " + testTable.getName() + " for entity " + + persistentClass.getClassName() + ", db is not empty."); + } - if (tmd != null) { - //table exist - - if (log.isDebugEnabled()) { - log.debug("Existing table found " + - testTable.getName() + " for entity " + - classMapping.getClassName() + - ", db is not empty."); + return false; } - - return false; } + tables.close(); } } finally { @@ -545,7 +500,7 @@ public class TopiaUtil { @Override public ConnectionProvider get() { if (connectionProvider == null) { - if (sessionFactory != null ) { + if (sessionFactory != null) { // If SessionFactory is provided, use the SessionFactoryServiceRegistry connectionProvider = HibernateProvider.getHibernateService(sessionFactory, ConnectionProvider.class); } else { diff --git a/topia-service-migration/src/main/java/org/nuiton/topia/migration/TopiaMigrationEngine.java b/topia-service-migration/src/main/java/org/nuiton/topia/migration/TopiaMigrationEngine.java index f457a49..93dcc31 100644 --- a/topia-service-migration/src/main/java/org/nuiton/topia/migration/TopiaMigrationEngine.java +++ b/topia-service-migration/src/main/java/org/nuiton/topia/migration/TopiaMigrationEngine.java @@ -30,6 +30,7 @@ import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.hibernate.Session; +import org.hibernate.boot.Metadata; import org.hibernate.cfg.AvailableSettings; import org.hibernate.cfg.Configuration; import org.nuiton.topia.migration.mappings.TMSVersion; @@ -47,6 +48,7 @@ import org.nuiton.version.VersionComparator; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Properties; @@ -128,6 +130,8 @@ public class TopiaMigrationEngine implements TopiaMigrationService { */ protected boolean showProgression; + protected Metadata metaData; + // /** // * delegate context listener. // */ @@ -227,12 +231,14 @@ public class TopiaMigrationEngine implements TopiaMigrationService { // Create the dedicated Hibernate Configuration which is just about the TMSVersion entity in order to create // the table using schemaExport if necessary versionConfiguration = createTMSHibernateConfiguration(topiaApplicationContext); + versionConfiguration.getProperties().remove(AvailableSettings.HBM2DDL_AUTO); // Make sure schema is not created by Hibernate + + HibernateProvider hibernateProvider = ((AbstractTopiaApplicationContext) applicationContext).getHibernateProvider(); - // Now build the mapping and create TMSVersion table if necessary - versionConfiguration.buildMappings(); + metaData = hibernateProvider.newMetaData(versionConfiguration, Collections.<Class<?>>singleton(TMSVersion.class)); - if (applicationContext.getConfiguration().isInitSchema() && TopiaUtil.isSchemaEmpty(versionConfiguration)) { - TMSVersionHibernateDao.createTMSSchema(versionConfiguration); + if (applicationContext.getConfiguration().isInitSchema() && TopiaUtil.isSchemaEmpty(versionConfiguration, metaData)) { + TMSVersionHibernateDao.createTMSSchema(metaData); } // if (!migrateOnInit) { @@ -544,9 +550,8 @@ public class TopiaMigrationEngine implements TopiaMigrationService { try { // on vérifie que la table de versionning existe déjà - versionTableExist = - TopiaUtil.isSchemaExist(versionConfiguration, - TMSVersion.class.getName()); + versionTableExist = TopiaUtil.isSchemaExist(versionConfiguration,metaData, TMSVersion.class.getName()); + Preconditions.checkState(versionTableExist, "TMSVersion table should have be created during init"); @@ -603,9 +608,8 @@ public class TopiaMigrationEngine implements TopiaMigrationService { // Get a new Configuration instance (not initialized) Configuration applicationHibernateConfiguration = hibernateProvider.newHibernateConfiguration(); applicationHibernateConfiguration.getProperties().remove(AvailableSettings.HBM2DDL_AUTO); // Make sure schema is not created by Hibernate - applicationHibernateConfiguration.buildMappings(); - boolean result = TopiaUtil.isSchemaEmpty(applicationHibernateConfiguration); + boolean result = TopiaUtil.isSchemaEmpty(applicationHibernateConfiguration, metaData); return result; } diff --git a/topia-service-migration/src/main/java/org/nuiton/topia/migration/mappings/TMSVersionHibernateDao.java b/topia-service-migration/src/main/java/org/nuiton/topia/migration/mappings/TMSVersionHibernateDao.java index bd3f10b..b7bbe1c 100644 --- a/topia-service-migration/src/main/java/org/nuiton/topia/migration/mappings/TMSVersionHibernateDao.java +++ b/topia-service-migration/src/main/java/org/nuiton/topia/migration/mappings/TMSVersionHibernateDao.java @@ -29,9 +29,11 @@ import org.apache.commons.logging.LogFactory; import org.hibernate.Criteria; import org.hibernate.HibernateException; import org.hibernate.Session; +import org.hibernate.boot.Metadata; import org.hibernate.cfg.Configuration; import org.hibernate.jdbc.Work; import org.hibernate.tool.hbm2ddl.SchemaExport; +import org.hibernate.tool.schema.TargetType; import org.nuiton.topia.persistence.TopiaException; import org.nuiton.topia.persistence.util.TopiaUtil; import org.nuiton.version.Version; @@ -41,6 +43,7 @@ import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; +import java.util.EnumSet; import java.util.List; /** @@ -72,18 +75,26 @@ public class TMSVersionHibernateDao { } } - public static void createTMSSchema(Configuration configuration) { + public static void createTMSSchema(Metadata metadata) { // creer le schema en base // dans la configuration il n'y a que la table version - SchemaExport schemaExport = new SchemaExport(configuration); - schemaExport.create(log.isDebugEnabled(), true); + SchemaExport schemaExport = new SchemaExport(); + EnumSet<TargetType> targetTypes = EnumSet.of(TargetType.DATABASE); + if (log.isDebugEnabled()) { + targetTypes.add(TargetType.STDOUT); + } + schemaExport.create(targetTypes, metadata); } - public static void dropTMSSchema(Configuration configuration) { + public static void dropTMSSchema(Metadata metadata) { // supprimer le schema en base // dans la configuration il n'y a que la table version - SchemaExport schemaExport = new SchemaExport(configuration); - schemaExport.drop(log.isDebugEnabled(), true); + SchemaExport schemaExport = new SchemaExport(); + EnumSet<TargetType> targetTypes = EnumSet.of(TargetType.DATABASE); + if (log.isDebugEnabled()) { + targetTypes.add(TargetType.STDOUT); + } + schemaExport.drop(targetTypes,metadata); } public static TMSVersion saveVersion(Session session, String version) throws TopiaException { -- To stop receiving notification emails like this one, please contact nuiton.org SCM administrator <admin+scm@nuiton.org>.
participants (1)
-
nuiton.org scm