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 42ca0647f7e7e10ddcba52b53fcc0d5de5064c3a Author: Tony CHEMIT <chemit@codelutin.com> Date: Sat Oct 8 10:20:02 2016 +0200 Update to hibernate 5.2.3 --- pom.xml | 2 +- .../topia/it/legacy/framework/TopiaUtilTest.java | 9 +- .../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 ++- 10 files changed, 235 insertions(+), 182 deletions(-) diff --git a/pom.xml b/pom.xml index 719d728..a373e8f 100644 --- a/pom.xml +++ b/pom.xml @@ -225,7 +225,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.3</liquibaseVersion> diff --git a/topia-it/src/test/java/org/nuiton/topia/it/legacy/framework/TopiaUtilTest.java b/topia-it/src/test/java/org/nuiton/topia/it/legacy/framework/TopiaUtilTest.java index be1d8db..d095150 100644 --- a/topia-it/src/test/java/org/nuiton/topia/it/legacy/framework/TopiaUtilTest.java +++ b/topia-it/src/test/java/org/nuiton/topia/it/legacy/framework/TopiaUtilTest.java @@ -24,6 +24,7 @@ package org.nuiton.topia.it.legacy.framework; * #L% */ +import org.hibernate.boot.Metadata; import org.hibernate.cfg.Configuration; import org.junit.Rule; import org.junit.Test; @@ -101,7 +102,8 @@ public class TopiaUtilTest { @Test(expected = IllegalArgumentException.class) public void testIsSchemaExistFailed() throws Exception { Configuration hibernateCfg = db.getApplicationContext().getHibernateProvider().getHibernateConfiguration(); - TopiaUtil.isSchemaExist(hibernateCfg, "fake"); + Metadata metaData = db.getApplicationContext().getHibernateProvider().getMetaData(); + TopiaUtil.isSchemaExist(hibernateCfg,metaData, "fake"); } @Test @@ -109,14 +111,15 @@ public class TopiaUtilTest { String personClassName = PersonImpl.class.getName(); Configuration hibernateCfg = db.getApplicationContext().getHibernateProvider().getHibernateConfiguration(); + Metadata metaData = db.getApplicationContext().getHibernateProvider().getMetaData(); // First, test before DB is created, the table should not exist - assertFalse(TopiaUtil.isSchemaExist(hibernateCfg, personClassName)); + assertFalse(TopiaUtil.isSchemaExist(hibernateCfg,metaData, personClassName)); // Create schema db.getApplicationContext().createSchema(); // Now table should exist - assertTrue(TopiaUtil.isSchemaExist(hibernateCfg, personClassName)); + assertTrue(TopiaUtil.isSchemaExist(hibernateCfg, metaData, personClassName)); } } 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 5d107aa..b951d03 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>.