branch feature/3666 updated (bb97226 -> 0743603)
This is an automated email from the git hooks/post-receive script. New change to branch feature/3666 in repository topia. See http://git.nuiton.org/topia.git from bb97226 refs #3666: Update to Hibernate 5 new 4ec9195 refs #3666: fix tests new 0743603 Fix migration service tests The 2 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 07436039f24e5f733a785be0725bc360a872cd99 Merge: 4ec9195 bb97226 Author: Eric Chatellier <eric.chatellier@gmail.com> Date: Sat Dec 5 23:06:54 2015 +0100 Fix migration service tests commit 4ec9195c056a77751bc1e9887e10d324449d288d Author: Eric Chatellier <chatellier@codelutin.com> Date: Sat Dec 5 20:59:14 2015 +0100 refs #3666: fix tests Summary of changes: .../it/mapping/test13/EntityWithNaturalIdTest.java | 18 ++++++++---- .../nuiton/topia/persistence/util/TopiaUtil.java | 33 ++++++++++++++-------- .../topia/migration/TopiaMigrationEngineTest.java | 2 +- 3 files changed, 34 insertions(+), 19 deletions(-) -- 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/3666 in repository topia. See http://git.nuiton.org/topia.git commit 4ec9195c056a77751bc1e9887e10d324449d288d Author: Eric Chatellier <chatellier@codelutin.com> Date: Sat Dec 5 20:59:14 2015 +0100 refs #3666: fix tests --- pom.xml | 27 +- topia-it/pom.xml | 4 +- .../topia/it/legacy/framework/TopiaUtilTest.java | 48 +-- .../it/mapping/test13/EntityWithNaturalIdTest.java | 18 +- topia-junit/pom.xml | 2 +- .../topia/junit/AbstractDatabaseResource.java | 2 +- topia-persistence/pom.xml | 17 +- .../topia/persistence/event/TopiaContextEvent.java | 3 +- .../internal/AbstractTopiaApplicationContext.java | 108 +++---- .../persistence/internal/AbstractTopiaDao.java | 3 +- .../internal/AbstractTopiaPersistenceContext.java | 61 ++-- .../persistence/internal/HibernateProvider.java | 199 +++++++------ .../persistence/support/TopiaHibernateSupport.java | 14 +- .../topia/persistence/util/EntityOperator.java | 3 +- .../nuiton/topia/persistence/util/TopiaUtil.java | 327 ++++++--------------- topia-service-csv/pom.xml | 2 +- topia-service-flyway/pom.xml | 2 +- topia-service-liquibase/pom.xml | 2 +- topia-service-migration/pom.xml | 2 +- .../migration/AbstractTopiaMigrationCallback.java | 14 +- .../topia/migration/TopiaMigrationEngine.java | 114 +++---- .../topia/migration/mappings/TMSVersionDAO.java | 11 +- .../migration/mappings/TMSVersionHibernateDao.java | 16 +- .../topia/migration/mappings/TMSVersion.hbm.xml | 7 +- .../topia/migration/TopiaMigrationEngineTest.java | 2 +- topia-service-replication/pom.xml | 2 +- topia-templates/pom.xml | 10 +- .../templates/EntityHibernateMappingGenerator.java | 38 ++- 28 files changed, 463 insertions(+), 595 deletions(-) diff --git a/pom.xml b/pom.xml index 776bc6e..17be068 100644 --- a/pom.xml +++ b/pom.xml @@ -6,7 +6,7 @@ $Id$ $HeadURL$ %% - Copyright (C) 2004 - 2013 CodeLutin, Chatellier Eric + Copyright (C) 2004 - 2015 CodeLutin, Chatellier Eric %% This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as @@ -33,7 +33,7 @@ </parent> <artifactId>topia</artifactId> - <version>3.0-SNAPSHOT</version> + <version>3.1-SNAPSHOT</version> <packaging>pom</packaging> <name>ToPIA</name> @@ -242,8 +242,7 @@ <h2Version>1.3.176</h2Version> <hamcrestVersion>1.3</hamcrestVersion> - <hibernateVersion>5.0.0-SNAPSHOT</hibernateVersion> - <javassistVersion>3.18.2-GA</javassistVersion> + <hibernateVersion>5.0.5.Final</hibernateVersion> <junitVersion>4.12</junitVersion> <liquibaseVersion>3.3.1</liquibaseVersion> <log4jVersion>1.2.17</log4jVersion> @@ -307,24 +306,12 @@ <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>${hibernateVersion}</version> - <exclusions> - <exclusion> - <groupId>org.slf4j</groupId> - <artifactId>slf4j-api</artifactId> - </exclusion> - </exclusions> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-ehcache</artifactId> <version>${hibernateVersion}</version> - <exclusions> - <exclusion> - <groupId>org.slf4j</groupId> - <artifactId>slf4j-api</artifactId> - </exclusion> - </exclusions> <scope>runtime</scope> </dependency> @@ -334,11 +321,11 @@ <version>${hibernateVersion}</version> <scope>runtime</scope> </dependency> - + <dependency> - <groupId>org.javassist</groupId> - <artifactId>javassist</artifactId> - <version>${javassistVersion}</version> + <groupId>javax.transaction</groupId> + <artifactId>jta</artifactId> + <version>1.1</version> <scope>runtime</scope> </dependency> diff --git a/topia-it/pom.xml b/topia-it/pom.xml index 4310046..e4c34aa 100644 --- a/topia-it/pom.xml +++ b/topia-it/pom.xml @@ -6,7 +6,7 @@ $Id$ $HeadURL$ %% - Copyright (C) 2004 - 2010 CodeLutin + Copyright (C) 2004 - 2015 CodeLutin %% This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as @@ -30,7 +30,7 @@ <parent> <groupId>org.nuiton</groupId> <artifactId>topia</artifactId> - <version>3.0-SNAPSHOT</version> + <version>3.1-SNAPSHOT</version> </parent> <groupId>org.nuiton.topia</groupId> 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..7045dc1 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 @@ -1,30 +1,12 @@ package org.nuiton.topia.it.legacy.framework; -/* - * #%L - * ToPIA :: IT - * $Id$ - * $HeadURL$ - * %% - * Copyright (C) 2004 - 2014 CodeLutin - * %% - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Lesser Public License for more details. - * - * You should have received a copy of the GNU General Lesser Public - * License along with this program. If not, see - * <http://www.gnu.org/licenses/lgpl-3.0.html>. - * #L% - */ +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; -import org.hibernate.cfg.Configuration; import org.junit.Rule; import org.junit.Test; import org.nuiton.topia.it.legacy.TopiaItLegacyDatabase; @@ -34,15 +16,9 @@ import org.nuiton.topia.it.legacy.topiatest.Personne; import org.nuiton.topia.persistence.BeanTopiaConfiguration; import org.nuiton.topia.persistence.TopiaConfiguration; import org.nuiton.topia.persistence.TopiaConfigurationBuilder; +import org.nuiton.topia.persistence.internal.HibernateProvider; import org.nuiton.topia.persistence.util.TopiaUtil; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; - /** * Test pour les methodes de {@link TopiaUtil}. * @@ -100,23 +76,23 @@ public class TopiaUtilTest { @Test(expected = IllegalArgumentException.class) public void testIsSchemaExistFailed() throws Exception { - Configuration hibernateCfg = db.getApplicationContext().getHibernateProvider().getHibernateConfiguration(); - TopiaUtil.isSchemaExist(hibernateCfg, "fake"); + HibernateProvider hibernateProvider = db.getApplicationContext().getHibernateProvider(); + TopiaUtil.isSchemaExist(hibernateProvider, "fake"); } @Test public void testIsSchemaExist() throws Exception { String personClassName = PersonImpl.class.getName(); - Configuration hibernateCfg = db.getApplicationContext().getHibernateProvider().getHibernateConfiguration(); + HibernateProvider hibernateProvider = db.getApplicationContext().getHibernateProvider(); // First, test before DB is created, the table should not exist - assertFalse(TopiaUtil.isSchemaExist(hibernateCfg, personClassName)); + assertFalse(TopiaUtil.isSchemaExist(hibernateProvider, personClassName)); // Create schema db.getApplicationContext().createSchema(); // Now table should exist - assertTrue(TopiaUtil.isSchemaExist(hibernateCfg, personClassName)); + assertTrue(TopiaUtil.isSchemaExist(hibernateProvider, personClassName)); } } diff --git a/topia-it/src/test/java/org/nuiton/topia/it/mapping/test13/EntityWithNaturalIdTest.java b/topia-it/src/test/java/org/nuiton/topia/it/mapping/test13/EntityWithNaturalIdTest.java index 2cf9339..8fa31d3 100644 --- a/topia-it/src/test/java/org/nuiton/topia/it/mapping/test13/EntityWithNaturalIdTest.java +++ b/topia-it/src/test/java/org/nuiton/topia/it/mapping/test13/EntityWithNaturalIdTest.java @@ -1,13 +1,15 @@ package org.nuiton.topia.it.mapping.test13; +import java.util.Date; + /* * #%L * ToPIA :: IT * $Id$ * $HeadURL$ * %% - * Copyright (C) 2004 - 2014 CodeLutin + * Copyright (C) 2004 - 2015 CodeLutin * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as @@ -27,14 +29,11 @@ package org.nuiton.topia.it.mapping.test13; import org.junit.Assert; import org.junit.Before; +import org.junit.Ignore; import org.junit.Test; - - +import org.nuiton.topia.it.mapping.AbstractMappingTest; import org.nuiton.topia.it.mapping.TopiaItMappingTopiaPersistenceContext; import org.nuiton.topia.persistence.TopiaException; -import org.nuiton.topia.it.mapping.AbstractMappingTest; - -import java.util.Date; /** * Tests a entity with a {@code natural id}. @@ -54,6 +53,13 @@ public class EntityWithNaturalIdTest extends AbstractMappingTest { aDAO = getDao(tx, A13A.class); } + /** + * Since hibernate 5.0.x, this test is failing, because null values are allowed for natural id. + * Docs says that it's not possible: + * https://docs.jboss.org/hibernate/orm/5.0/manual/en-US/html/ch05.html#mapping... + * + * @throws TopiaException + */ @Test(expected = TopiaException.class) public void createWithNull() throws TopiaException { diff --git a/topia-junit/pom.xml b/topia-junit/pom.xml index 43e8fd7..faed6cb 100644 --- a/topia-junit/pom.xml +++ b/topia-junit/pom.xml @@ -30,7 +30,7 @@ <parent> <groupId>org.nuiton</groupId> <artifactId>topia</artifactId> - <version>3.0-SNAPSHOT</version> + <version>3.1-SNAPSHOT</version> </parent> <groupId>org.nuiton.topia</groupId> diff --git a/topia-junit/src/main/java/org/nuiton/topia/junit/AbstractDatabaseResource.java b/topia-junit/src/main/java/org/nuiton/topia/junit/AbstractDatabaseResource.java index 4fd9d47..6fd3302 100644 --- a/topia-junit/src/main/java/org/nuiton/topia/junit/AbstractDatabaseResource.java +++ b/topia-junit/src/main/java/org/nuiton/topia/junit/AbstractDatabaseResource.java @@ -6,7 +6,7 @@ package org.nuiton.topia.junit; * $Id$ * $HeadURL$ * %% - * Copyright (C) 2004 - 2014 CodeLutin + * Copyright (C) 2004 - 2015 CodeLutin * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as diff --git a/topia-persistence/pom.xml b/topia-persistence/pom.xml index ee242ef..0202e67 100644 --- a/topia-persistence/pom.xml +++ b/topia-persistence/pom.xml @@ -6,7 +6,7 @@ $Id$ $HeadURL$ %% - Copyright (C) 2004 - 2010 CodeLutin + Copyright (C) 2004 - 2015 CodeLutin %% This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as @@ -30,7 +30,7 @@ <parent> <groupId>org.nuiton</groupId> <artifactId>topia</artifactId> - <version>3.0-SNAPSHOT</version> + <version>3.1-SNAPSHOT</version> </parent> <groupId>org.nuiton.topia</groupId> @@ -87,24 +87,25 @@ <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> </dependency> + <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-ehcache</artifactId> </dependency> <dependency> - <groupId>org.javassist</groupId> - <artifactId>javassist</artifactId> + <groupId>org.hibernate</groupId> + <artifactId>hibernate-c3p0</artifactId> </dependency> <dependency> - <groupId>org.slf4j</groupId> - <artifactId>slf4j-log4j12</artifactId> + <groupId>javax.transaction</groupId> + <artifactId>jta</artifactId> </dependency> <dependency> - <groupId>org.hibernate</groupId> - <artifactId>hibernate-c3p0</artifactId> + <groupId>org.slf4j</groupId> + <artifactId>slf4j-log4j12</artifactId> </dependency> <!-- BD H2 for testing --> diff --git a/topia-persistence/src/main/java/org/nuiton/topia/persistence/event/TopiaContextEvent.java b/topia-persistence/src/main/java/org/nuiton/topia/persistence/event/TopiaContextEvent.java index 8db1534..f432009 100644 --- a/topia-persistence/src/main/java/org/nuiton/topia/persistence/event/TopiaContextEvent.java +++ b/topia-persistence/src/main/java/org/nuiton/topia/persistence/event/TopiaContextEvent.java @@ -6,7 +6,7 @@ package org.nuiton.topia.persistence.event; * $Id$ * $HeadURL$ * %% - * Copyright (C) 2004 - 2014 CodeLutin + * Copyright (C) 2004 - 2015 CodeLutin * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as @@ -27,7 +27,6 @@ package org.nuiton.topia.persistence.event; import java.util.EventObject; import org.nuiton.topia.persistence.TopiaApplicationContext; -import org.nuiton.topia.persistence.TopiaPersistenceContext; /** * TODO-fdesbois-20100507 : Need javadoc. 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 4ec861e..5a9ee68 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 @@ -1,35 +1,20 @@ package org.nuiton.topia.persistence.internal; -/* - * #%L - * ToPIA :: Persistence - * $Id$ - * $HeadURL$ - * %% - * Copyright (C) 2004 - 2014 CodeLutin - * %% - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Lesser Public License for more details. - * - * You should have received a copy of the GNU General Lesser Public - * License along with this program. If not, see - * <http://www.gnu.org/licenses/lgpl-3.0.html>. - * #L% - */ +import java.beans.PropertyChangeListener; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Properties; +import java.util.Set; +import java.util.WeakHashMap; -import com.google.common.base.Preconditions; -import com.google.common.collect.Iterables; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.hibernate.HibernateException; -import org.hibernate.cfg.Configuration; +import org.hibernate.boot.Metadata; +import org.hibernate.boot.spi.MetadataImplementor; import org.hibernate.tool.hbm2ddl.SchemaExport; import org.hibernate.tool.hbm2ddl.SchemaUpdate; import org.nuiton.topia.persistence.TopiaApplicationContext; @@ -53,15 +38,32 @@ import org.nuiton.topia.persistence.internal.support.TopiaServiceSupportImpl; import org.nuiton.topia.persistence.support.TopiaServiceSupport; import org.nuiton.topia.persistence.util.TopiaUtil; -import java.beans.PropertyChangeListener; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.Properties; -import java.util.Set; -import java.util.WeakHashMap; +/* + * #%L + * ToPIA :: Persistence + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2004 - 2015 CodeLutin + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Lesser Public License for more details. + * + * You should have received a copy of the GNU General Lesser Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/lgpl-3.0.html>. + * #L% + */ + +import com.google.common.base.Preconditions; +import com.google.common.collect.Iterables; /** * The application context is the main class in ToPIA usage. This class is a kind of equivalent of the RootTopiaContext. @@ -140,8 +142,8 @@ public abstract class AbstractTopiaApplicationContext<K extends TopiaPersistence } // AThimel 14/06/14 Make sure this method is called AFTER ToPIA's schema init, otherwise Hibernate may have created the schema itself - // The next line will trigger the Configuration#buildMappings() method which really initializes Hibernate - getHibernateProvider().getHibernateConfiguration(); + // The next line will trigger the MetadataSources#buildMetadata() method which really initializes Hibernate + getHibernateProvider().getHibernateMetadata(); } @@ -351,17 +353,15 @@ 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); + // AThimel 14/06/14 getHibernateMetadata() may create the schema + boolean result = TopiaUtil.isSchemaEmpty(getHibernateProvider()); return result; } @Override 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()); + // AThimel 14/06/14 getHibernateMetadata() may create the schema + boolean result = TopiaUtil.isSchemaExist(getHibernateProvider(), clazz.getName()); return result; } @@ -379,8 +379,8 @@ public abstract class AbstractTopiaApplicationContext<K extends TopiaPersistence showSchema = true; } topiaFiresSupport.firePreCreateSchema(this); - Configuration hibernateConfiguration = getHibernateProvider().getHibernateConfiguration(); - new SchemaExport(hibernateConfiguration).execute(showSchema, true, false, true); + Metadata hibernateMetadata = getHibernateProvider().getHibernateMetadata(); + new SchemaExport((MetadataImplementor) hibernateMetadata).execute(showSchema, true, false, true); topiaFiresSupport.firePostCreateSchema(this); } catch (HibernateException eee) { throw new TopiaException( @@ -392,9 +392,9 @@ public abstract class AbstractTopiaApplicationContext<K extends TopiaPersistence @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); + // AThimel 14/06/14 getHibernateMetadata() may create the schema + Metadata hibernateMetadata = getHibernateProvider().getHibernateMetadata(); + new SchemaExport((MetadataImplementor) hibernateMetadata).execute(true, false, false, true); } catch (HibernateException eee) { throw new TopiaException( String.format("Could not show create schema for reason: %s", @@ -412,9 +412,9 @@ public abstract class AbstractTopiaApplicationContext<K extends TopiaPersistence } 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); + // AThimel 14/06/14 getHibernateConfiguration() may create the schema + Metadata hibernateMetadata = getHibernateProvider().getHibernateMetadata(); + new SchemaUpdate((MetadataImplementor) hibernateMetadata).execute(showSchema, true); topiaFiresSupport.firePostUpdateSchema(this); } catch (HibernateException eee) { throw new TopiaException( @@ -432,9 +432,9 @@ public abstract class AbstractTopiaApplicationContext<K extends TopiaPersistence } 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); + // AThimel 14/06/14 getHibernateConfiguration() may create the schema + Metadata hibernateMetadata = getHibernateProvider().getHibernateMetadata(); + new SchemaExport((MetadataImplementor) hibernateMetadata).execute(showSchema, true, true, false); topiaFiresSupport.firePostDropSchema(this); } catch (HibernateException eee) { throw new TopiaException( diff --git a/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/AbstractTopiaDao.java b/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/AbstractTopiaDao.java index 4071931..bfd97c9 100644 --- a/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/AbstractTopiaDao.java +++ b/topia-persistence/src/main/java/org/nuiton/topia/persistence/internal/AbstractTopiaDao.java @@ -6,7 +6,7 @@ package org.nuiton.topia.persistence.internal; * $Id$ * $HeadURL$ * %% - * Copyright (C) 2004 - 2014 CodeLutin + * Copyright (C) 2004 - 2015 CodeLutin * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as @@ -75,7 +75,6 @@ import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.NoSuchElementException; -import java.util.Set; /** * This class has the common methods usable for each Dao managed by Topia. It is not JPA implementation dependent, it 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..0cfec09 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 @@ -1,5 +1,32 @@ package org.nuiton.topia.persistence.internal; +import java.lang.reflect.InvocationTargetException; +import java.util.List; +import java.util.Map; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.hibernate.FlushMode; +import org.hibernate.HibernateException; +import org.hibernate.Session; +import org.hibernate.SessionFactory; +import org.hibernate.Transaction; +import org.hibernate.boot.Metadata; +import org.hibernate.service.ServiceRegistry; +import org.nuiton.topia.persistence.TopiaDao; +import org.nuiton.topia.persistence.TopiaEntity; +import org.nuiton.topia.persistence.TopiaException; +import org.nuiton.topia.persistence.TopiaIdFactory; +import org.nuiton.topia.persistence.TopiaPersistenceContext; +import org.nuiton.topia.persistence.TopiaReplicationDestination; +import org.nuiton.topia.persistence.internal.support.HibernateTopiaJpaSupport; +import org.nuiton.topia.persistence.internal.support.HibernateTopiaReplicationSupport; +import org.nuiton.topia.persistence.internal.support.HibernateTopiaSqlSupport; +import org.nuiton.topia.persistence.internal.support.TopiaFiresSupport; +import org.nuiton.topia.persistence.support.TopiaHibernateSupport; +import org.nuiton.topia.persistence.support.TopiaJpaSupport; +import org.nuiton.topia.persistence.support.TopiaSqlSupport; + /* * #%L * ToPIA :: Persistence @@ -26,31 +53,6 @@ package org.nuiton.topia.persistence.internal; import com.google.common.base.Preconditions; import com.google.common.collect.Maps; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.hibernate.FlushMode; -import org.hibernate.HibernateException; -import org.hibernate.Session; -import org.hibernate.SessionFactory; -import org.hibernate.Transaction; -import org.hibernate.cfg.Configuration; -import org.nuiton.topia.persistence.TopiaDao; -import org.nuiton.topia.persistence.TopiaEntity; -import org.nuiton.topia.persistence.TopiaException; -import org.nuiton.topia.persistence.TopiaIdFactory; -import org.nuiton.topia.persistence.TopiaPersistenceContext; -import org.nuiton.topia.persistence.TopiaReplicationDestination; -import org.nuiton.topia.persistence.internal.support.HibernateTopiaJpaSupport; -import org.nuiton.topia.persistence.internal.support.HibernateTopiaReplicationSupport; -import org.nuiton.topia.persistence.internal.support.HibernateTopiaSqlSupport; -import org.nuiton.topia.persistence.internal.support.TopiaFiresSupport; -import org.nuiton.topia.persistence.support.TopiaHibernateSupport; -import org.nuiton.topia.persistence.support.TopiaJpaSupport; -import org.nuiton.topia.persistence.support.TopiaSqlSupport; - -import java.lang.reflect.InvocationTargetException; -import java.util.List; -import java.util.Map; /** * Abstract implementation of the TopiaPersistenceContext. This class will be extended by a generated one in order to @@ -177,8 +179,13 @@ public abstract class AbstractTopiaPersistenceContext implements TopiaPersistenc } @Override - public Configuration getHibernateConfiguration() { - return hibernateProvider.getHibernateConfiguration(); + public Metadata getHibernateMetadata() { + return hibernateProvider.getHibernateMetadata(); + } + + @Override + public ServiceRegistry getHibernateServiceRegistry() { + return hibernateProvider.getHibernateServiceRegistry(); } } 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 bcabf44..b3558b0 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 @@ -1,36 +1,18 @@ package org.nuiton.topia.persistence.internal; -/* - * #%L - * ToPIA :: Persistence - * $Id$ - * $HeadURL$ - * %% - * Copyright (C) 2004 - 2014 CodeLutin - * %% - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Lesser Public License for more details. - * - * You should have received a copy of the GNU General Lesser Public - * License along with this program. If not, see - * <http://www.gnu.org/licenses/lgpl-3.0.html>. - * #L% - */ +import java.util.Properties; +import java.util.Set; -import com.google.common.base.Preconditions; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.hibernate.HibernateException; import org.hibernate.SessionFactory; +import org.hibernate.boot.Metadata; +import org.hibernate.boot.MetadataSources; import org.hibernate.boot.registry.StandardServiceRegistry; +import org.hibernate.boot.registry.StandardServiceRegistryBuilder; +import org.hibernate.boot.spi.SessionFactoryOptions; import org.hibernate.cfg.AvailableSettings; -import org.hibernate.cfg.Configuration; import org.hibernate.dialect.DB2Dialect; import org.hibernate.dialect.DerbyDialect; import org.hibernate.dialect.H2Dialect; @@ -48,6 +30,7 @@ import org.hibernate.service.ServiceRegistry; import org.hibernate.service.spi.SessionFactoryServiceRegistry; import org.hibernate.service.spi.Stoppable; import org.nuiton.topia.persistence.HibernateAvailableSettings; +import org.nuiton.topia.persistence.SchemaValidationTopiaException; import org.nuiton.topia.persistence.TopiaConfiguration; import org.nuiton.topia.persistence.TopiaEntity; import org.nuiton.topia.persistence.internal.support.TopiaHibernateEventListener; @@ -55,8 +38,31 @@ import org.nuiton.topia.persistence.jdbc.JdbcConfigurationBuilder; import org.nuiton.topia.persistence.support.TopiaServiceSupport; import org.nuiton.topia.persistence.util.TopiaUtil; -import java.util.Properties; -import java.util.Set; +/* + * #%L + * ToPIA :: Persistence + * $Id$ + * $HeadURL$ + * %% + * Copyright (C) 2004 - 2015 CodeLutin, Eric Chatellier + * %% + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Lesser Public License for more details. + * + * You should have received a copy of the GNU General Lesser Public + * License along with this program. If not, see + * <http://www.gnu.org/licenses/lgpl-3.0.html>. + * #L% + */ + +import com.google.common.base.Preconditions; /** * @author Arnaud Thimel (Code Lutin) @@ -65,8 +71,10 @@ public class HibernateProvider { private static final Log log = LogFactory.getLog(HibernateProvider.class); + protected Properties hibernateProperties; + protected ServiceRegistry hibernateServiceRegistry; protected SessionFactory hibernateSessionFactory; - protected Configuration hibernateConfiguration; + protected Metadata hibernateMetadata; protected TopiaConfiguration topiaConfiguration; protected TopiaServiceSupport topiaServiceSupport; @@ -87,75 +95,88 @@ public class HibernateProvider { this.entityClasses = entityClasses; } - /** - * Get the current Hibernate Configuration. The Configuration instance is lazy-initialized using the - * {@link #newHibernateConfiguration()} method. The returned instance is always initialized and mapping are built. - * - * @return the Hibernate Configuration instance with built mappings. - */ - public Configuration getHibernateConfiguration() { - if (hibernateConfiguration == null) { - 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(); + public ServiceRegistry getHibernateServiceRegistry() { + if (hibernateServiceRegistry == null) { + hibernateServiceRegistry = newHibernateServiceRegistry(); + } + return hibernateServiceRegistry; + } + + public Metadata getHibernateMetadata() { + if (hibernateMetadata == null) { + hibernateMetadata = newHibernateMetadata(); } - return hibernateConfiguration; + return hibernateMetadata; } - /** - * Creates a new Configuration instance. The instance is create but mappings are not built yet to avoid unwanted - * database access. - * - * @return a new Hibernate Configuration instance without built mappings. - */ - public Configuration newHibernateConfiguration() { + protected ServiceRegistry newHibernateServiceRegistry() { + StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder(); - Configuration newHibernateConfiguration = new Configuration(); + Properties properties = getHibernateProperties(); - for (Class<? extends TopiaEntity> entityClass : entityClasses) { - newHibernateConfiguration.addClass(entityClass); + if (log.isInfoEnabled()) { + log.info("will start hibernate with configuration " + properties); } - Properties properties = new Properties(); + TopiaUtil.warnOnAutomaticSchemaOperationRisk(properties); - // JDBC - properties.put(AvailableSettings.URL, topiaConfiguration.getJdbcConnectionUrl()); - properties.put(AvailableSettings.DRIVER, topiaConfiguration.getJdbcDriverClass().getName()); - properties.put(AvailableSettings.USER, topiaConfiguration.getJdbcConnectionUser()); - properties.put(AvailableSettings.PASS, topiaConfiguration.getJdbcConnectionPassword()); + builder.applySettings(properties); + ServiceRegistry serviceRegistry = builder.build(); - // dialect - properties.put(AvailableSettings.DIALECT, getHibernateDialect(topiaConfiguration)); + return serviceRegistry; + } + + public Properties getHibernateProperties() { + if (hibernateProperties == null) { + hibernateProperties = new Properties(); + + // JDBC + hibernateProperties.put(AvailableSettings.URL, topiaConfiguration.getJdbcConnectionUrl()); + hibernateProperties.put(AvailableSettings.DRIVER, topiaConfiguration.getJdbcDriverClass().getName()); + hibernateProperties.put(AvailableSettings.USER, topiaConfiguration.getJdbcConnectionUser()); + hibernateProperties.put(AvailableSettings.PASS, topiaConfiguration.getJdbcConnectionPassword()); + + // dialect + hibernateProperties.put(AvailableSettings.DIALECT, getHibernateDialect(topiaConfiguration)); + + // using c3p0 with default configuration + hibernateProperties.put(AvailableSettings.C3P0_MIN_SIZE, 5); + hibernateProperties.put(AvailableSettings.C3P0_MAX_SIZE, 20); + hibernateProperties.put(AvailableSettings.C3P0_TIMEOUT, 1800); + hibernateProperties.put(AvailableSettings.C3P0_MAX_STATEMENTS, 50); + + // schema validation + if (topiaConfiguration.isValidateSchema()) { + hibernateProperties.put(AvailableSettings.HBM2DDL_AUTO, "validate"); + } - // using c3p0 with default configuration - properties.put(AvailableSettings.C3P0_MIN_SIZE, 5); - properties.put(AvailableSettings.C3P0_MAX_SIZE, 20); - properties.put(AvailableSettings.C3P0_TIMEOUT, 1800); - properties.put(AvailableSettings.C3P0_MAX_STATEMENTS, 50); + hibernateProperties.put(HibernateAvailableSettings.NAMING_STRATEGY, org.hibernate.cfg.ImprovedNamingStrategy.class.getName()); + hibernateProperties.put(AvailableSettings.FORMAT_SQL, true); + hibernateProperties.put(AvailableSettings.USE_SQL_COMMENTS, true); - // schema validation - if (topiaConfiguration.isValidateSchema()) { - properties.put(AvailableSettings.HBM2DDL_AUTO, "validate"); + // user specific configuration + hibernateProperties.putAll(topiaConfiguration.getHibernateExtraConfiguration()); } - - properties.put(HibernateAvailableSettings.NAMING_STRATEGY, org.hibernate.cfg.ImprovedNamingStrategy.class.getName()); - properties.put(AvailableSettings.FORMAT_SQL, true); - properties.put(AvailableSettings.USE_SQL_COMMENTS, true); - - // user specific configuration - properties.putAll(topiaConfiguration.getHibernateExtraConfiguration()); - - if (log.isInfoEnabled()) { - log.info("will start hibernate with configuration " + properties); + + return hibernateProperties; + } + + /** + * Creates a new Metadata instance. + * + * @return a new Hibernate Metadata. + */ + protected Metadata newHibernateMetadata() { + MetadataSources sources = new MetadataSources(getHibernateServiceRegistry()); + + for (Class<? extends TopiaEntity> entityClass : entityClasses) { + String className = entityClass.getName(); + String hbmFile = className.replace('.', '/') + ".hbm.xml"; + sources.addResource(hbmFile); } - - newHibernateConfiguration.setProperties(properties); - - return newHibernateConfiguration; - + + Metadata metadata = sources.buildMetadata(); + return metadata; } public static String getHibernateDialect(TopiaConfiguration topiaConfiguration) { @@ -240,7 +261,7 @@ public class HibernateProvider { protected 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; @@ -308,8 +329,12 @@ public class HibernateProvider { if (hibernateSessionFactory == null) { - Configuration effectiveHibernateConfiguration = getHibernateConfiguration(); - hibernateSessionFactory = TopiaUtil.newSessionFactory(effectiveHibernateConfiguration); + try { + hibernateSessionFactory = getHibernateMetadata().getSessionFactoryBuilder().build(); + } catch (HibernateException e) { + SchemaValidationTopiaException.throwIfHibernateExceptionIsAboutSchemaValidation(e); + throw e; + } EventListenerRegistry eventListenerRegistry = getHibernateService(hibernateSessionFactory, EventListenerRegistry.class); 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..5211be7 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 @@ -6,7 +6,7 @@ package org.nuiton.topia.persistence.support; * $Id$ * $HeadURL$ * %% - * Copyright (C) 2004 - 2014 CodeLutin + * Copyright (C) 2004 - 2015 CodeLutin * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as @@ -26,7 +26,8 @@ package org.nuiton.topia.persistence.support; import org.hibernate.Session; import org.hibernate.SessionFactory; -import org.hibernate.cfg.Configuration; +import org.hibernate.boot.Metadata; +import org.hibernate.service.ServiceRegistry; /** * This API provides methods to interact with Hibernate @@ -42,13 +43,18 @@ public interface TopiaHibernateSupport { Session getHibernateSession(); /** + * @return Returns the ServiceRegistry. + */ + ServiceRegistry getHibernateServiceRegistry(); + + /** * @return Returns the HibernateFactory. */ SessionFactory getHibernateFactory(); /** - * @return Returns the Hibernate configuration + * @return Returns the Hibernate Metadata */ - Configuration getHibernateConfiguration(); + Metadata getHibernateMetadata(); } diff --git a/topia-persistence/src/main/java/org/nuiton/topia/persistence/util/EntityOperator.java b/topia-persistence/src/main/java/org/nuiton/topia/persistence/util/EntityOperator.java index 833bcef..762d2b1 100644 --- a/topia-persistence/src/main/java/org/nuiton/topia/persistence/util/EntityOperator.java +++ b/topia-persistence/src/main/java/org/nuiton/topia/persistence/util/EntityOperator.java @@ -6,7 +6,7 @@ package org.nuiton.topia.persistence.util; * $Id$ * $HeadURL$ * %% - * Copyright (C) 2004 - 2014 CodeLutin + * Copyright (C) 2004 - 2015 CodeLutin * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as @@ -29,7 +29,6 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nuiton.topia.persistence.TopiaEntity; import org.nuiton.topia.persistence.TopiaEntityEnum; -import org.nuiton.util.ObjectUtil; import java.beans.BeanInfo; import java.beans.IntrospectionException; 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 958b13b..297b587 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 @@ -1,49 +1,36 @@ package org.nuiton.topia.persistence.util; -/* - * #%L - * ToPIA :: Persistence - * $Id$ - * $HeadURL$ - * %% - * Copyright (C) 2004 - 2014 CodeLutin, Chatellier Eric - * %% - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Lesser Public License for more details. - * - * You should have received a copy of the GNU General Lesser Public - * License along with this program. If not, see - * <http://www.gnu.org/licenses/lgpl-3.0.html>. - * #L% - */ +import java.io.Closeable; +import java.io.IOException; +import java.net.URL; +import java.sql.Connection; +import java.sql.SQLException; +import java.util.Collection; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.Properties; +import java.util.StringTokenizer; +import java.util.regex.Pattern; -import com.google.common.base.Function; -import com.google.common.base.Preconditions; -import com.google.common.base.Supplier; -import com.google.common.collect.ImmutableSet; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.SessionFactory; -import org.hibernate.boot.registry.StandardServiceRegistry; +import org.hibernate.boot.Metadata; import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.hibernate.cfg.AvailableSettings; -import org.hibernate.cfg.Configuration; -import org.hibernate.dialect.Dialect; import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider; +import org.hibernate.engine.jdbc.connections.spi.JdbcConnectionAccess; +import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; +import org.hibernate.engine.jdbc.spi.JdbcServices; 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.hibernate.resource.transaction.spi.TransactionStatus; +import org.hibernate.service.ServiceRegistry; +import org.hibernate.tool.schema.extract.internal.DatabaseInformationImpl; +import org.hibernate.tool.schema.extract.spi.DatabaseInformation; +import org.hibernate.tool.schema.extract.spi.TableInformation; import org.nuiton.topia.persistence.TopiaEntity; import org.nuiton.topia.persistence.TopiaException; import org.nuiton.topia.persistence.TopiaNotFoundException; @@ -52,18 +39,10 @@ import org.nuiton.topia.persistence.support.TopiaHibernateSupport; import org.nuiton.util.RecursiveProperties; import org.nuiton.util.Resource; -import java.io.Closeable; -import java.io.IOException; -import java.net.URL; -import java.sql.Connection; -import java.sql.SQLException; -import java.util.HashMap; -import java.util.Iterator; -import java.util.LinkedHashMap; -import java.util.Map; -import java.util.Properties; -import java.util.StringTokenizer; -import java.util.regex.Pattern; +import com.google.common.base.Function; +import com.google.common.base.Preconditions; +import com.google.common.base.Supplier; +import com.google.common.collect.ImmutableSet; /** * TODO-fdesbois-20100507 : Need javadoc + translations for existing methods. @@ -169,28 +148,37 @@ public class TopiaUtil { * Test si une entité donnée correspondant a une configuration existe en * base. * - * @param topiaHibernateSupport the Hibernate support required for this operation + * @param hibernateProvider the hibernate provider required for this operation + * @param metadata hibernate metadata * @param entityName le nom de l'entite a tester * @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(HibernateProvider hibernateProvider, Metadata metadata, String entityName) { - ConnectionProviderSupplier connectionProviderSupplier = new ConnectionProviderSupplier(topiaHibernateSupport); + ServiceRegistry serviceRegistry = hibernateProvider.getHibernateServiceRegistry(); + ConnectionProviderSupplier connectionProviderSupplier + = new ConnectionProviderSupplier(serviceRegistry); boolean exist = false; try { - Configuration configuration = topiaHibernateSupport.getHibernateConfiguration(); - PersistentClass classMapping = - configuration.getClassMapping(entityName); + JdbcConnectionAccess jdbcConnectionAccess = serviceRegistry.getService( JdbcServices.class ).getBootstrapJdbcConnectionAccess(); + DatabaseInformation databaseInformation = new DatabaseInformationImpl( + serviceRegistry, + serviceRegistry.getService( JdbcEnvironment.class ), + jdbcConnectionAccess, + metadata.getDatabase().getDefaultNamespace().getPhysicalName().getCatalog(), + metadata.getDatabase().getDefaultNamespace().getPhysicalName().getSchema() + ); + + 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> classes = metadata.getEntityBindings(); + for (PersistentClass clazz : classes) { + log.info("available mapping " + clazz); } } throw new IllegalArgumentException( @@ -206,17 +194,11 @@ 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); - - TableMetadata tmd = meta.getTableMetadata( - testTable.getName(), testTable.getSchema(), - testTable.getCatalog(), testTable.isQuoted()); + TableInformation tmd = databaseInformation.getTableInformation(testTable.getQualifiedTableName()); if (tmd != null) { //table exist @@ -240,83 +222,25 @@ public class TopiaUtil { return exist; } - + /** - * Test si une entite donnee correspondant a une configuration existe en + * Test si une entité donnée correspondant a une configuration existe en * base. * - * @param configuration la configuration hibernate - * @param entityName le nom de l'entite a tester + * @param hibernateProvider the hibernate provider required for this operation + * @param entityName le nom de l'entite a tester * @return <tt>true</tt> si le schema de la table existe + * @since 2.6.4 */ - public static boolean isSchemaExist(Configuration configuration, + public static boolean isSchemaExist(HibernateProvider hibernateProvider, String entityName) { - - ConnectionProviderSupplier connectionProviderSupplier = - new ConnectionProviderSupplier(configuration); - - boolean exist = false; - - try { - PersistentClass classMapping = - configuration.getClassMapping(entityName); - if (classMapping == null) { - if (log.isInfoEnabled()) { - Iterator<?> itr = configuration.getClassMappings(); - while (itr.hasNext()) { - log.info("available mapping " + itr.next()); - } - } - 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); - } - - ConnectionProvider connectionProvider = - connectionProviderSupplier.get(); - - Dialect dialect = Dialect.getDialect(configuration.getProperties()); - - 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; - } - } finally { - connectionProvider.closeConnection(connection); - } - - } catch (SQLException e) { - log.error("Cant connect to database", e); - } finally { - try { - connectionProviderSupplier.close(); - } catch (IOException e) { - log.error("Cant close connection provider", e); - } - } - - return exist; + return isSchemaExist(hibernateProvider, hibernateProvider.getHibernateMetadata(), entityName); } - public static void warnOnAutomaticSchemaOperationRisk(Configuration configuration) { + public static void warnOnAutomaticSchemaOperationRisk(Properties properties) { if (log.isWarnEnabled()) { - String hbm2ddl = configuration.getProperties().getProperty(AvailableSettings.HBM2DDL_AUTO); + String hbm2ddl = properties.getProperty(AvailableSettings.HBM2DDL_AUTO); if (ImmutableSet.of("update", "create", "create-drop").contains(hbm2ddl)) { log.warn(String.format("Be careful, you are about to let Hibernate automatically create or update " + "your database schema. [%s=%s]", AvailableSettings.HBM2DDL_AUTO, hbm2ddl)); @@ -329,32 +253,39 @@ public class TopiaUtil { * Test if the db associated to the given {@code configuration} contains any of * the dealed entities. * - * @param configuration hibernate db configuration + * @param hibernateProvider hibernate provider + * @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(HibernateProvider hibernateProvider, Metadata metadata) { - warnOnAutomaticSchemaOperationRisk(configuration); + warnOnAutomaticSchemaOperationRisk(hibernateProvider.getHibernateProperties()); - ConnectionProviderSupplier connectionProviderSupplier = new ConnectionProviderSupplier(configuration); + ServiceRegistry serviceRegistry = hibernateProvider.getHibernateServiceRegistry(); + ConnectionProviderSupplier connectionProviderSupplier + = new ConnectionProviderSupplier(serviceRegistry); try { ConnectionProvider connectionProvider = connectionProviderSupplier.get(); - - Dialect dialect = Dialect.getDialect(configuration.getProperties()); + + JdbcConnectionAccess jdbcConnectionAccess = serviceRegistry.getService( JdbcServices.class ).getBootstrapJdbcConnectionAccess(); + DatabaseInformation databaseInformation = new DatabaseInformationImpl( + serviceRegistry, + serviceRegistry.getService( JdbcEnvironment.class ), + jdbcConnectionAccess, + metadata.getDatabase().getDefaultNamespace().getPhysicalName().getCatalog(), + metadata.getDatabase().getDefaultNamespace().getPhysicalName().getSchema() + ); 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(); + Collection<PersistentClass> classes = metadata.getEntityBindings(); + for (PersistentClass classMapping : classes) { Table testTable = classMapping.getTable(); if (testTable == null) { @@ -364,9 +295,7 @@ public class TopiaUtil { } - TableMetadata tmd = meta.getTableMetadata( - testTable.getName(), testTable.getSchema(), - testTable.getCatalog(), testTable.isQuoted()); + TableInformation tmd = databaseInformation.getTableInformation(testTable.getQualifiedTableName()); if (tmd != null) { //table exist @@ -399,91 +328,29 @@ public class TopiaUtil { return true; } - + /** * Test if the db associated to the given {@code configuration} contains any of * the dealed entities. * - * @param topiaHibernateSupport the Hibernate support required for this operation + * @param hibernateProvider hibernate provider * @return {@code true} if there is no schema for any of the dealed entities, * {@code false} otherwise. - * @since 2.5.3 + * @since 3.1 */ - public static boolean isSchemaEmpty(TopiaHibernateSupport topiaHibernateSupport) { - - ConnectionProviderSupplier connectionProviderSupplier = new ConnectionProviderSupplier(topiaHibernateSupport); - - Configuration configuration = topiaHibernateSupport.getHibernateConfiguration(); - - try { - - 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()); - } - - - TableMetadata tmd = meta.getTableMetadata( - testTable.getName(), testTable.getSchema(), - testTable.getCatalog(), testTable.isQuoted()); - - 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; - } - } - - } finally { - connectionProvider.closeConnection(connection); - } - - } catch (SQLException e) { - log.error("Cant connect to database", e); - } finally { - try { - connectionProviderSupplier.close(); - } catch (IOException e) { - log.error("Cant close connection provider", e); - } - } - - return true; + public static boolean isSchemaEmpty(HibernateProvider hibernateProvider) { + return isSchemaEmpty(hibernateProvider, hibernateProvider.getHibernateMetadata()); } - /** + /* * Return hibernate schema name * * @param config of hibernate * @return schema name - */ + * public static String getSchemaName(Configuration config) { return config.getProperty(AvailableSettings.DEFAULT_SCHEMA); - } + }*/ public static Map<String, Object> convertPropertiesArrayToMap(Object... propertyNamesAndValues) throws IllegalArgumentException { int propertiesLength = propertyNamesAndValues.length; @@ -527,7 +394,7 @@ public class TopiaUtil { /** * StandardServiceRegistry will be used if no SessionFactory is provided */ - protected StandardServiceRegistry standardServiceRegistry; + protected ServiceRegistry serviceRegistry; protected ConnectionProvider connectionProvider; @@ -536,10 +403,8 @@ public class TopiaUtil { sessionFactory = topiaHibernateSupport.getHibernateFactory(); } - public ConnectionProviderSupplier(Configuration configuration) { - Properties properties = configuration.getProperties(); - StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder(); - this.standardServiceRegistry = builder.applySettings(properties).build(); + public ConnectionProviderSupplier(ServiceRegistry serviceRegistry) { + this.serviceRegistry = serviceRegistry; } @Override @@ -550,7 +415,7 @@ public class TopiaUtil { connectionProvider = HibernateProvider.getHibernateService(sessionFactory, ConnectionProvider.class); } else { // otherwise use the StandardServiceRegistry - connectionProvider = standardServiceRegistry.getService(ConnectionProvider.class); + connectionProvider = serviceRegistry.getService(ConnectionProvider.class); } } return connectionProvider; @@ -562,17 +427,19 @@ public class TopiaUtil { // On the over hand, if standardServiceRegistry is provided, that means the its has been created explicitly // for the current instance, close it - if (standardServiceRegistry != null) { - StandardServiceRegistryBuilder.destroy(standardServiceRegistry); - } + // FIXME echatellier 20151205: serviceRegistry is not specific always specific to this provider + // this may not be closed in all case + //if (serviceRegistry != null) { + // StandardServiceRegistryBuilder.destroy(serviceRegistry); + //} } } - /** + /* * Builds a new instance of Hibernate SessionFactory according to the given Hibernate Configuration * @param hibernateConfiguration an initialized Hibernate Configuration * @return an instance of SessionFactory - */ + * public static SessionFactory newSessionFactory(Configuration hibernateConfiguration) { Properties properties = hibernateConfiguration.getProperties(); @@ -592,24 +459,24 @@ public class TopiaUtil { throw e; } return result; - } + }*/ /** * Apply the given Function in a Hibernate transaction. This method will init and destroy an Hibernate * SessionFactory together with a single Session. This Session will be commited if no exception is raised by the * function, otherwise will rollback. * - * @param configuration an initialized Hibernate Configuration + * @param metadata an initialized Hibernate metadata * @param function the function to run using a valid Hibernate Session * @param <V> the return type, match the function * @return the result of the given function */ - public static <V> V runInSession(Configuration configuration, Function<Session, V> function) { + public static <V> V runInSession(Metadata metadata, Function<Session, V> function) { SessionFactory sessionFactory = null; Session session = null; try { - sessionFactory = newSessionFactory(configuration); + sessionFactory = metadata.getSessionFactoryBuilder().build(); session = sessionFactory.openSession(); session.getTransaction().begin(); @@ -622,7 +489,7 @@ public class TopiaUtil { if (log.isErrorEnabled()) { log.error("Exception during Hibernate session usage, rollbacking transaction", eee); } - if (session != null && session.isOpen() && session.getTransaction().isActive()) { + if (session != null && session.isOpen() && session.getTransaction().getStatus() == TransactionStatus.ACTIVE) { session.getTransaction().rollback(); } throw new TopiaException("Exception during Hibernate session usage", eee); diff --git a/topia-service-csv/pom.xml b/topia-service-csv/pom.xml index 86543ac..e5b5925 100644 --- a/topia-service-csv/pom.xml +++ b/topia-service-csv/pom.xml @@ -30,7 +30,7 @@ <parent> <groupId>org.nuiton</groupId> <artifactId>topia</artifactId> - <version>3.0-SNAPSHOT</version> + <version>3.1-SNAPSHOT</version> </parent> <groupId>org.nuiton.topia</groupId> diff --git a/topia-service-flyway/pom.xml b/topia-service-flyway/pom.xml index 630653f..635ef0f 100644 --- a/topia-service-flyway/pom.xml +++ b/topia-service-flyway/pom.xml @@ -5,7 +5,7 @@ <parent> <groupId>org.nuiton</groupId> <artifactId>topia</artifactId> - <version>3.0-SNAPSHOT</version> + <version>3.1-SNAPSHOT</version> </parent> <groupId>org.nuiton.topia</groupId> diff --git a/topia-service-liquibase/pom.xml b/topia-service-liquibase/pom.xml index 4cd26ac..881d6ba 100644 --- a/topia-service-liquibase/pom.xml +++ b/topia-service-liquibase/pom.xml @@ -5,7 +5,7 @@ <parent> <groupId>org.nuiton</groupId> <artifactId>topia</artifactId> - <version>3.0-SNAPSHOT</version> + <version>3.1-SNAPSHOT</version> </parent> <groupId>org.nuiton.topia</groupId> diff --git a/topia-service-migration/pom.xml b/topia-service-migration/pom.xml index dea028b..6db6fb5 100644 --- a/topia-service-migration/pom.xml +++ b/topia-service-migration/pom.xml @@ -30,7 +30,7 @@ <parent> <groupId>org.nuiton</groupId> <artifactId>topia</artifactId> - <version>3.0-SNAPSHOT</version> + <version>3.1-SNAPSHOT</version> </parent> <groupId>org.nuiton.topia</groupId> diff --git a/topia-service-migration/src/main/java/org/nuiton/topia/migration/AbstractTopiaMigrationCallback.java b/topia-service-migration/src/main/java/org/nuiton/topia/migration/AbstractTopiaMigrationCallback.java index cd684c3..e050f82 100644 --- a/topia-service-migration/src/main/java/org/nuiton/topia/migration/AbstractTopiaMigrationCallback.java +++ b/topia-service-migration/src/main/java/org/nuiton/topia/migration/AbstractTopiaMigrationCallback.java @@ -6,7 +6,7 @@ package org.nuiton.topia.migration; * $Id$ * $HeadURL$ * %% - * Copyright (C) 2004 - 2014 CodeLutin + * Copyright (C) 2004 - 2015 CodeLutin * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as @@ -30,12 +30,12 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.hibernate.Session; import org.hibernate.SessionFactory; -import org.hibernate.cfg.Configuration; +import org.hibernate.boot.Metadata; +import org.hibernate.resource.transaction.spi.TransactionStatus; import org.nuiton.topia.migration.mappings.TMSVersionHibernateDao; import org.nuiton.topia.persistence.TopiaException; import org.nuiton.topia.persistence.internal.support.HibernateTopiaSqlSupport; import org.nuiton.topia.persistence.support.TopiaSqlSupport; -import org.nuiton.topia.persistence.util.TopiaUtil; import org.nuiton.util.StringUtil; import org.nuiton.util.version.Version; @@ -84,7 +84,7 @@ public abstract class AbstractTopiaMigrationCallback { * <p/> * Note: pour chaque version a appliquer, on ouvre une nouvelle transaction. * - * @param versionConfiguration configuration Hibernate permettant d'accéder à la base + * @param versionMetadata configuration Hibernate permettant d'accéder à la base * @param dbVersion database version * @param showSql drapeau pour afficher les requete sql * @param showProgression drapeau pour afficher la progression @@ -92,7 +92,7 @@ public abstract class AbstractTopiaMigrationCallback { * ggrement * @return {@code true} si la migration est accepté, {@code false} autrement. */ - public boolean doMigration(Configuration versionConfiguration, + public boolean doMigration(Metadata versionMetadata, Version dbVersion, boolean showSql, boolean showProgression, @@ -108,7 +108,7 @@ public abstract class AbstractTopiaMigrationCallback { SessionFactory sessionFactory = null; Session session = null; try { - sessionFactory = TopiaUtil.newSessionFactory(versionConfiguration); + sessionFactory = versionMetadata.buildSessionFactory(); session = sessionFactory.openSession(); session.getTransaction().begin(); @@ -129,7 +129,7 @@ public abstract class AbstractTopiaMigrationCallback { if (log.isErrorEnabled()) { log.error("Exception during schema migration, rollbacking transaction", eee); } - if (session != null && session.isOpen() && session.getTransaction().isActive()) { + if (session != null && session.isOpen() && session.getTransaction().getStatus() == TransactionStatus.ACTIVE) { session.getTransaction().rollback(); } throw new TopiaException("Exception during schema migration", eee); 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 cdfca09..5904ee7 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 @@ -1,12 +1,40 @@ package org.nuiton.topia.migration; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.Properties; +import java.util.Set; +import java.util.SortedSet; +import java.util.TreeSet; + +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.boot.MetadataSources; +import org.hibernate.service.ServiceRegistry; +import org.nuiton.topia.migration.mappings.TMSVersion; +import org.nuiton.topia.migration.mappings.TMSVersionHibernateDao; +import org.nuiton.topia.persistence.TopiaApplicationContext; +import org.nuiton.topia.persistence.TopiaException; +import org.nuiton.topia.persistence.TopiaMigrationServiceException; +import org.nuiton.topia.persistence.internal.AbstractTopiaApplicationContext; +import org.nuiton.topia.persistence.internal.HibernateProvider; +import org.nuiton.topia.persistence.util.TopiaUtil; +import org.nuiton.util.version.Version; +import org.nuiton.util.version.VersionBuilder; +import org.nuiton.util.version.VersionComparator; + /* * #%L * ToPIA :: Service Migration * $Id$ * $HeadURL$ * %% - * Copyright (C) 2004 - 2014 CodeLutin + * Copyright (C) 2004 - 2015 CodeLutin * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as @@ -26,33 +54,6 @@ package org.nuiton.topia.migration; import com.google.common.base.Function; import com.google.common.base.Preconditions; -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.cfg.AvailableSettings; -import org.hibernate.cfg.Configuration; -import org.nuiton.topia.migration.mappings.TMSVersion; -import org.nuiton.topia.migration.mappings.TMSVersionHibernateDao; -import org.nuiton.topia.persistence.TopiaApplicationContext; -import org.nuiton.topia.persistence.TopiaConfiguration; -import org.nuiton.topia.persistence.TopiaException; -import org.nuiton.topia.persistence.TopiaMigrationServiceException; -import org.nuiton.topia.persistence.internal.AbstractTopiaApplicationContext; -import org.nuiton.topia.persistence.internal.HibernateProvider; -import org.nuiton.topia.persistence.util.TopiaUtil; -import org.nuiton.util.version.Version; -import org.nuiton.util.version.VersionBuilder; -import org.nuiton.util.version.VersionComparator; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Map; -import java.util.Properties; -import java.util.Set; -import java.util.SortedSet; -import java.util.TreeSet; /** * Le moteur de migration proposé par topia. Il est basé sur un {@link AbstractTopiaMigrationCallback} @@ -70,9 +71,14 @@ public class TopiaMigrationEngine implements TopiaMigrationService { private final static Log log = LogFactory.getLog(TopiaMigrationEngine.class); /** + * Hibernate provider containing service factory without metadata. + */ + protected HibernateProvider hibernateProvider; + + /** * Hibernate Configuration only with TMSVersion entity (set during init) */ - protected Configuration versionConfiguration; + protected Metadata versionMetadata; /** * Flag to know if the TMSVersion table is existing (set during init) @@ -224,14 +230,16 @@ public class TopiaMigrationEngine implements TopiaMigrationService { applicationContext = topiaApplicationContext; + hibernateProvider = ((AbstractTopiaApplicationContext)topiaApplicationContext).getHibernateProvider(); + ServiceRegistry serviceRegistry = hibernateProvider.getHibernateServiceRegistry(); + // 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); + versionMetadata = createTMSHibernateMetadata(serviceRegistry); // Now build the mapping and create TMSVersion table if necessary - versionConfiguration.buildMappings(); - if (TopiaUtil.isSchemaEmpty(versionConfiguration)) { - TMSVersionHibernateDao.createTMSSchema(versionConfiguration); + if (TopiaUtil.isSchemaEmpty(hibernateProvider, versionMetadata)) { + TMSVersionHibernateDao.createTMSSchema(versionMetadata); } // if (!migrateOnInit) { @@ -406,7 +414,7 @@ public class TopiaMigrationEngine implements TopiaMigrationService { } // perform the migration - migrationDone = callback.doMigration(versionConfiguration, + migrationDone = callback.doMigration(versionMetadata, dbVersion, showSql, showProgression, @@ -474,7 +482,7 @@ public class TopiaMigrationEngine implements TopiaMigrationService { // } - TopiaUtil.runInSession(versionConfiguration, new Function<Session, TMSVersion>() { + TopiaUtil.runInSession(versionMetadata, new Function<Session, TMSVersion>() { @Override public TMSVersion apply(Session input) { @@ -544,12 +552,12 @@ public class TopiaMigrationEngine implements TopiaMigrationService { // on vérifie que la table de versionning existe déjà versionTableExist = - TopiaUtil.isSchemaExist(versionConfiguration, + TopiaUtil.isSchemaExist(hibernateProvider, versionMetadata, TMSVersion.class.getName()); Preconditions.checkState(versionTableExist, "TMSVersion table should have be created during init"); - TMSVersion tmsVersion = TopiaUtil.runInSession(versionConfiguration, new Function<Session, TMSVersion>() { + TMSVersion tmsVersion = TopiaUtil.runInSession(versionMetadata, new Function<Session, TMSVersion>() { @Override public TMSVersion apply(Session object) { TMSVersion tmsVersion = TMSVersionHibernateDao.readVersion(object); @@ -600,11 +608,12 @@ public class TopiaMigrationEngine implements TopiaMigrationService { ((AbstractTopiaApplicationContext) applicationContext).getHibernateProvider(); // 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(); + Metadata applicationHibernateMetadata = hibernateProvider.getHibernateMetadata(); - boolean result = TopiaUtil.isSchemaEmpty(applicationHibernateConfiguration); + // FIXME echatellier 20151123 : this can't be restored since hibernate 5 update + //applicationHibernateConfiguration.getProperties().remove(AvailableSettings.HBM2DDL_AUTO); // Make sure schema is not created by Hibernate + + boolean result = TopiaUtil.isSchemaEmpty(hibernateProvider, applicationHibernateMetadata); return result; } @@ -622,26 +631,17 @@ public class TopiaMigrationEngine implements TopiaMigrationService { /** * Creates the hibernate configuration to be used by the service. * - * @param appContext the topia application context used to copy database credentials + * @param serviceRegistry hibernate service registry + * @return Metadata * @since 2.5.3 */ - protected static Configuration createTMSHibernateConfiguration(TopiaApplicationContext appContext) { - - TopiaConfiguration topiaConfiguration = appContext.getConfiguration(); + protected static Metadata createTMSHibernateMetadata(ServiceRegistry serviceRegistry) { - Properties prop = new Properties(); + MetadataSources metadataSource = new MetadataSources(serviceRegistry); + String hbmFile = TMSVersion.class.getName().replace('.', '/') + ".hbm.xml"; + metadataSource.addResource(hbmFile); - prop.put(AvailableSettings.URL, topiaConfiguration.getJdbcConnectionUrl()); - prop.put(AvailableSettings.USER, topiaConfiguration.getJdbcConnectionUser()); - prop.put(AvailableSettings.PASS, topiaConfiguration.getJdbcConnectionPassword()); - prop.put(AvailableSettings.DRIVER, topiaConfiguration.getJdbcDriverClass().getName()); - prop.put(AvailableSettings.DIALECT, HibernateProvider.getHibernateDialect(topiaConfiguration)); - - Configuration result = new Configuration(); - result.setProperties(prop); - result.addClass(TMSVersion.class); - - return result; + return metadataSource.buildMetadata(); } @Override diff --git a/topia-service-migration/src/main/java/org/nuiton/topia/migration/mappings/TMSVersionDAO.java b/topia-service-migration/src/main/java/org/nuiton/topia/migration/mappings/TMSVersionDAO.java index 2161e01..c857a32 100644 --- a/topia-service-migration/src/main/java/org/nuiton/topia/migration/mappings/TMSVersionDAO.java +++ b/topia-service-migration/src/main/java/org/nuiton/topia/migration/mappings/TMSVersionDAO.java @@ -6,7 +6,7 @@ package org.nuiton.topia.migration.mappings; * $Id$ * $HeadURL$ * %% - * Copyright (C) 2004 - 2014 CodeLutin + * Copyright (C) 2004 - 2015 CodeLutin * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as @@ -28,7 +28,6 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.nuiton.topia.persistence.TopiaException; import org.nuiton.topia.persistence.support.TopiaHibernateSupport; -import org.nuiton.util.version.Version; /** * TMSVersion DAO helper. @@ -65,15 +64,17 @@ public class TMSVersionDAO extends TMSVersionHibernateDao { public static final String LEGACY_MAPPING = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + - "<!DOCTYPE hibernate-mapping PUBLIC \"-//Hibernate/Hibernate Mapping DTD 3.0//EN\" \"classpath://org/hibernate/hibernate-mapping-3.0.dtd\">\n" + - "<hibernate-mapping>\n" + + "<hibernate-mapping xmlns=\"http://www.hibernate.org/xsd/hibernate-mapping\"" + + " xsi:schemaLocation=\"http://www.hibernate.org/xsd/hibernate-mapping classpath://org/hibernate/hibernate-mapping-4.0.xsd\"" + + " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n" + " <class name=\"" + TMSVersion.class.getName() + "\" table=\"" + LEGACY_TABLE_NAME + "\">\n" + " <id column=\"" + TMSVersion.PROPERTY_VERSION + "\" name=\"" + TMSVersion.PROPERTY_VERSION + "\"/>\n" + " </class>\n" + "</hibernate-mapping>"; + /* FIXME echatellier 20151205 : not migrated because unused public static Version getVersion(TopiaHibernateSupport tx, String tableName) { return getVersion(tx.getHibernateConfiguration(), tx.getHibernateSession(), tableName); - } + }*/ } 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 41045e9..eadd49d 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 @@ -35,11 +35,11 @@ import org.apache.commons.logging.LogFactory; import org.hibernate.Criteria; import org.hibernate.HibernateException; import org.hibernate.Session; -import org.hibernate.cfg.Configuration; +import org.hibernate.boot.Metadata; +import org.hibernate.boot.spi.MetadataImplementor; import org.hibernate.jdbc.Work; import org.hibernate.tool.hbm2ddl.SchemaExport; import org.nuiton.topia.persistence.TopiaException; -import org.nuiton.topia.persistence.util.TopiaUtil; import org.nuiton.util.version.Version; import org.nuiton.util.version.VersionBuilder; @@ -72,17 +72,17 @@ 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 schemaExport = new SchemaExport((MetadataImplementor)metadata); schemaExport.create(log.isDebugEnabled(), true); } - 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 schemaExport = new SchemaExport((MetadataImplementor)metadata); schemaExport.drop(log.isDebugEnabled(), true); } @@ -117,7 +117,7 @@ public class TMSVersionHibernateDao { } } - public static Version getVersion(Configuration hibernateConfiguration, Session session, String tableName) { + /*public static Version getVersion(Configuration hibernateConfiguration, Session session, String tableName) { try { // Get schema name String schemaName = TopiaUtil.getSchemaName(hibernateConfiguration); @@ -129,7 +129,7 @@ public class TMSVersionHibernateDao { } catch (HibernateException he) { throw new TopiaException("Can't obtain dbVersion for reason " + he.getMessage(), he); } - } + }*/ public static class GetVersionWork implements Work { diff --git a/topia-service-migration/src/main/resources/org/nuiton/topia/migration/mappings/TMSVersion.hbm.xml b/topia-service-migration/src/main/resources/org/nuiton/topia/migration/mappings/TMSVersion.hbm.xml index 9c95ab1..65161ad 100644 --- a/topia-service-migration/src/main/resources/org/nuiton/topia/migration/mappings/TMSVersion.hbm.xml +++ b/topia-service-migration/src/main/resources/org/nuiton/topia/migration/mappings/TMSVersion.hbm.xml @@ -5,7 +5,7 @@ $Id$ $HeadURL$ %% - Copyright (C) 2004 - 2014 CodeLutin + Copyright (C) 2004 - 2015 CodeLutin %% This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as @@ -23,8 +23,9 @@ #L% --> -<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "classpath://org/hibernate/hibernate-mapping-3.0.dtd"> -<hibernate-mapping> +<hibernate-mapping xmlns="http://www.hibernate.org/xsd/hibernate-mapping" + xsi:schemaLocation="http://www.hibernate.org/xsd/hibernate-mapping classpath://org/hibernate/hibernate-mapping-4.0.xsd" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <class name="org.nuiton.topia.migration.mappings.TMSVersion" table="tms_version"> <id column="version" name="version"/> </class> diff --git a/topia-service-migration/src/test/java/org/nuiton/topia/migration/TopiaMigrationEngineTest.java b/topia-service-migration/src/test/java/org/nuiton/topia/migration/TopiaMigrationEngineTest.java index 6ef173f..bb3cfae 100644 --- a/topia-service-migration/src/test/java/org/nuiton/topia/migration/TopiaMigrationEngineTest.java +++ b/topia-service-migration/src/test/java/org/nuiton/topia/migration/TopiaMigrationEngineTest.java @@ -6,7 +6,7 @@ package org.nuiton.topia.migration; * $Id$ * $HeadURL$ * %% - * Copyright (C) 2004 - 2014 CodeLutin + * Copyright (C) 2004 - 2015 CodeLutin * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as diff --git a/topia-service-replication/pom.xml b/topia-service-replication/pom.xml index 70820ca..c17bae9 100644 --- a/topia-service-replication/pom.xml +++ b/topia-service-replication/pom.xml @@ -30,7 +30,7 @@ <parent> <groupId>org.nuiton</groupId> <artifactId>topia</artifactId> - <version>3.0-SNAPSHOT</version> + <version>3.1-SNAPSHOT</version> </parent> <groupId>org.nuiton.topia</groupId> diff --git a/topia-templates/pom.xml b/topia-templates/pom.xml index 47294e4..9d2a77a 100644 --- a/topia-templates/pom.xml +++ b/topia-templates/pom.xml @@ -6,7 +6,7 @@ $Id$ $HeadURL$ %% - Copyright (C) 2004 - 2010 CodeLutin + Copyright (C) 2004 - 2015 CodeLutin %% This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as @@ -30,7 +30,7 @@ <parent> <groupId>org.nuiton</groupId> <artifactId>topia</artifactId> - <version>3.0-SNAPSHOT</version> + <version>3.1-SNAPSHOT</version> </parent> <groupId>org.nuiton.topia</groupId> @@ -87,17 +87,13 @@ <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> </dependency> + <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-ehcache</artifactId> </dependency> <dependency> - <groupId>org.javassist</groupId> - <artifactId>javassist</artifactId> - </dependency> - - <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </dependency> diff --git a/topia-templates/src/main/java/org/nuiton/topia/templates/EntityHibernateMappingGenerator.java b/topia-templates/src/main/java/org/nuiton/topia/templates/EntityHibernateMappingGenerator.java index 573f270..13926bd 100644 --- a/topia-templates/src/main/java/org/nuiton/topia/templates/EntityHibernateMappingGenerator.java +++ b/topia-templates/src/main/java/org/nuiton/topia/templates/EntityHibernateMappingGenerator.java @@ -6,7 +6,7 @@ package org.nuiton.topia.templates; * $Id$ * $HeadURL$ * %% - * Copyright (C) 2004 - 2014 CodeLutin + * Copyright (C) 2004 - 2015 CodeLutin * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as @@ -172,7 +172,7 @@ public class EntityHibernateMappingGenerator extends ObjectModelGenerator { generateFromTagValue(optionalAttributesMap,HIBERNATE_ATTRIBUTE_DISCRIMINATOR_VALUE, clazzDOType); } String optionalAttributes = attributesToString(optionalAttributesMap); -/*{ <<%=inheritanceStrategy%> name="<%=clazzDOType%>" extends="<%=superClassDOType%>" node="<%=clazzDOType%>" abstract="<%=isAbstract%>"<%=optionalAttributes%>> +/*{ <<%=inheritanceStrategy%> name="<%=clazzDOType%>" extends="<%=superClassDOType%>" abstract="<%=isAbstract%>"<%=optionalAttributes%>> }*/ if ("joined-subclass".equals(inheritanceStrategy)) { /*{ <key column="topiaId" /> @@ -182,8 +182,8 @@ public class EntityHibernateMappingGenerator extends ObjectModelGenerator { noneNaturalAttributes.addAll(input.getAttributes()); } else { String optionalAttributes = attributesToString(optionalAttributesMap); -/*{ <class name="<%=clazzDOType%>" table="<%=tableName%>" node="<%=clazzDOType%>" abstract="<%=isAbstract%>"<%=optionalAttributes%>> - <id name="topiaId" type="string" length="255" node="@topiaId"/> +/*{ <class name="<%=clazzDOType%>" table="<%=tableName%>" abstract="<%=isAbstract%>"<%=optionalAttributes%>> + <id name="topiaId" type="string" length="255"/> }*/ // cas où on defini la super class, il faut un discriminator seulement dans le cas de // la strategy subclass @@ -216,8 +216,8 @@ public class EntityHibernateMappingGenerator extends ObjectModelGenerator { /*{ </natural-id> }*/ } -/*{ <version name="topiaVersion" type="long" node="@topiaVersion"/> - <property name="topiaCreateDate" type="timestamp" node="@topiaCreateDate"/> +/*{ <version name="topiaVersion" type="long"/> + <property name="topiaCreateDate" type="timestamp"/> }*/ } @@ -354,7 +354,7 @@ public class EntityHibernateMappingGenerator extends ObjectModelGenerator { String attrType = getType(aPackage, clazz, attr, true); String lazy = generateFromTagValue(HIBERNATE_ATTRIBUTE_LAZY, topiaTagValues.getLazyTagValue(attr)); String attrColumn = templateHelper.getDbName(attr); -/*{<%=prefix%> <many-to-one name="<%=attrName%>" class="<%=attrType%>" <%=lazy%>column="<%=attrColumn%>" node="<%=attrName%>/@topiaId" <%=notNull%>/> +/*{<%=prefix%> <many-to-one name="<%=attrName%>" class="<%=attrType%>" <%=lazy%>column="<%=attrColumn%>" <%=notNull%>/> }*/ // } //Ne sert plus grâce à l'utilisation de la navigabilité @@ -551,7 +551,7 @@ public class EntityHibernateMappingGenerator extends ObjectModelGenerator { // simple case with no column node to generate -/*{ column="<%=attrColumn%>" node="<%=attrName%>"<%=optionalAttributes%>}*/ +/*{ column="<%=attrColumn%>" <%=optionalAttributes%>}*/ if (attrIsEnumeration) { /*{> <%=prefix%> <type name="org.hibernate.type.EnumType"> @@ -616,7 +616,7 @@ public class EntityHibernateMappingGenerator extends ObjectModelGenerator { ObjectModelAttribute attr, String prefix) throws IOException { // boolean accessField = hasUnidirectionalRelationOnAbstractType(attr.getReverseAttribute(), model); -/// *{ <one-to-one name="<%=getName(attr)%>" class="<%=getType(attr)%>"<%=(templateHelper.notEmpty(attr.getTagValue(templateHelper.TAG_LENGTH))?(" length=\"" + attr.getTagValue(templateHelper.TAG_LENGTH) + "\""):"")%><%=((attr.isComposite() || attr.hasAssociationClass())?" cascade=\"delete\"":"")%><%=((accessField)?" access=\"field\"":"")%> node="<%=getName(attr)%>/@topiaId" /> +/// *{ <one-to-one name="<%=getName(attr)%>" class="<%=getType(attr)%>"<%=(templateHelper.notEmpty(attr.getTagValue(templateHelper.TAG_LENGTH))?(" length=\"" + attr.getTagValue(templateHelper.TAG_LENGTH) + "\""):"")%><%=((attr.isComposite() || attr.hasAssociationClass())?" cascade=\"delete\"":"")%><%=((accessField)?" access=\"field\"":"")%> /> //} */ // for hibernate many-to-one with unique="true" => one-to-one @@ -656,16 +656,16 @@ public class EntityHibernateMappingGenerator extends ObjectModelGenerator { inverse = HIBERNATE_ATTRIBUTE_INVERSE+"=\"true\" "; } if (needsIndex) { -/*{<%=prefix%> <<%=collType%> name="<%=attrName%>" <%=inverse%><%=lazy%><%=cascade%>node="<%=attrName%>"> +/*{<%=prefix%> <<%=collType%> name="<%=attrName%>" <%=inverse%><%=lazy%><%=cascade%>> <%=prefix%> <key column="<%=reverseAttrDBName%>"/> <%=prefix%> <list-index column="<%=reverseAttrDBName%>_idx"/> -<%=prefix%> <one-to-many class="<%=attrType%>" node="topiaId"/> +<%=prefix%> <one-to-many class="<%=attrType%>"/> <%=prefix%> </<%=collType%>> }*/ }else { -/*{<%=prefix%> <<%=collType%> name="<%=attrName%>" <%=inverse%><%=orderBy%><%=fetch%><%=lazy%><%=cascade%>node="<%=attrName%>"> +/*{<%=prefix%> <<%=collType%> name="<%=attrName%>" <%=inverse%><%=orderBy%><%=fetch%><%=lazy%><%=cascade%>> <%=prefix%> <key column="<%=reverseAttrDBName%>"/> -<%=prefix%> <one-to-many class="<%=attrType%>" node="topiaId"/> +<%=prefix%> <one-to-many class="<%=attrType%>"/> <%=prefix%> </<%=collType%>> }*/ } @@ -735,7 +735,7 @@ public class EntityHibernateMappingGenerator extends ObjectModelGenerator { boolean attrIsEnumeration = attr.getClassifier() != null && attr.getClassifier().isEnum(); -/*{<%=prefix%> <<%=collType%> name="<%=attrName%>" <%=lazy%>node="<%=attrName%>"> +/*{<%=prefix%> <<%=collType%> name="<%=attrName%>" <%=lazy%>> <%=prefix%> <key column="OWNER"/> }*/ if (needsIndex) { @@ -745,7 +745,7 @@ public class EntityHibernateMappingGenerator extends ObjectModelGenerator { if (attrIsEnumeration) { boolean useEnumerationName = topiaTagValues.hasUseEnumerationNameTagValue(attr, clazz, aPackage, model); -/*{<%=prefix%> <element column="<%=attrColumn%>" node="id"> +/*{<%=prefix%> <element column="<%=attrColumn%>"> <%=prefix%> <type name="org.hibernate.type.EnumType"> <%=prefix%> <param name="<%=org.hibernate.type.EnumType.ENUM%>"><%=attrType%></param> }*/ @@ -761,7 +761,7 @@ public class EntityHibernateMappingGenerator extends ObjectModelGenerator { <%=prefix%> </element> }*/ } else { -/*{<%=prefix%> <element type="<%=attrType%>" column="<%=attrColumn%>" node="id"/> +/*{<%=prefix%> <element type="<%=attrType%>" column="<%=attrColumn%>"/> }*/ } /*{<%=prefix%> </<%=collType%>> @@ -803,8 +803,6 @@ public class EntityHibernateMappingGenerator extends ObjectModelGenerator { if (isUnique) { /*{unique="true" }*/ } -/*{node="<%=attrName%>/@topiaId"}*/ - /*{/> }*/ } @@ -858,14 +856,14 @@ public class EntityHibernateMappingGenerator extends ObjectModelGenerator { generateFromTagValue(optionalAttributesMap, HIBERNATE_ATTRIBUTE_SCHEMA, schema); String optionalAttributes=attributesToString(optionalAttributesMap); -/*{<%=prefix%> <<%=collType%> name="<%=attrName%>" table="<%=tableName%>" <%=inverse%><%=lazy%><%=cascade%> node="<%=attrName%>"<%=optionalAttributes%>> +/*{<%=prefix%> <<%=collType%> name="<%=attrName%>" table="<%=tableName%>" <%=inverse%><%=lazy%><%=cascade%> <%=optionalAttributes%>> <%=prefix%> <key column="<%=reverseAttrDBName%>"/> }*/ if (needsIndex) { /*{<%=prefix%> <list-index column="<%=reverseAttrDBName%>_idx"/> }*/ } -/*{<%=prefix%> <many-to-many class="<%=attrType%>" column="<%=attrColumn%>" <%=orderBy%>node="topiaId"/> +/*{<%=prefix%> <many-to-many class="<%=attrType%>" column="<%=attrColumn%>" <%=orderBy%>/> <%=prefix%> </<%=collType%>> }*/ } -- 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/3666 in repository topia. See http://git.nuiton.org/topia.git commit 07436039f24e5f733a785be0725bc360a872cd99 Merge: 4ec9195 bb97226 Author: Eric Chatellier <eric.chatellier@gmail.com> Date: Sat Dec 5 23:06:54 2015 +0100 Fix migration service tests .../nuiton/topia/persistence/util/TopiaUtil.java | 25 ++++++++++++++-------- .../topia/migration/TopiaMigrationEngineTest.java | 2 +- 2 files changed, 17 insertions(+), 10 deletions(-) diff --cc topia-persistence/src/main/java/org/nuiton/topia/persistence/util/TopiaUtil.java index 297b587,68a1107..e1eab79 --- 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 @@@ -15,11 -15,11 +15,17 @@@ import java.util.regex.Pattern import org.apache.commons.logging.Log; 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.SessionFactoryBuilder; ++import org.hibernate.boot.internal.SessionFactoryBuilderImpl; ++import org.hibernate.boot.registry.StandardServiceRegistry; import org.hibernate.boot.registry.StandardServiceRegistryBuilder; ++import org.hibernate.boot.spi.MetadataImplementor; import org.hibernate.cfg.AvailableSettings; ++import org.hibernate.cfg.Configuration; import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider; import org.hibernate.engine.jdbc.connections.spi.JdbcConnectionAccess; import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; @@@ -31,6 -31,6 +37,7 @@@ import org.hibernate.service.ServiceReg import org.hibernate.tool.schema.extract.internal.DatabaseInformationImpl; import org.hibernate.tool.schema.extract.spi.DatabaseInformation; import org.hibernate.tool.schema.extract.spi.TableInformation; ++import org.nuiton.topia.persistence.SchemaValidationTopiaException; import org.nuiton.topia.persistence.TopiaEntity; import org.nuiton.topia.persistence.TopiaException; import org.nuiton.topia.persistence.TopiaNotFoundException; @@@ -437,23 -435,23 +444,21 @@@ public class TopiaUtil /* * Builds a new instance of Hibernate SessionFactory according to the given Hibernate Configuration -- * @param hibernateConfiguration an initialized Hibernate Configuration ++ * @param metadata an initialized Hibernate metadata * @return an instance of SessionFactory * -- public static SessionFactory newSessionFactory(Configuration hibernateConfiguration) { -- -- Properties properties = hibernateConfiguration.getProperties(); ++ public static SessionFactory newSessionFactory(Metadata metadata) { // Use the next 2 lines if bootstrap customization is needed (classloader, autoclose, ...) // {@see org.hibernate.boot.registry.internal.BootstrapServiceRegistryImpl) // BootstrapServiceRegistry bootstrap = new BootstrapServiceRegistryBuilder().build(); // StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder(bootstrap); -- StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder(); -- StandardServiceRegistry standardServiceRegistry = builder.applySettings(properties).build(); ++ //StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder(); ++ SessionFactoryBuilder builder = new SessionFactoryBuilderImpl((MetadataImplementor)metadata); SessionFactory result; try { -- result = hibernateConfiguration.buildSessionFactory(standardServiceRegistry); ++ result = builder.build(); } catch (HibernateException e) { SchemaValidationTopiaException.throwIfHibernateExceptionIsAboutSchemaValidation(e); throw e; @@@ -476,7 -474,7 +481,7 @@@ SessionFactory sessionFactory = null; Session session = null; try { -- sessionFactory = metadata.getSessionFactoryBuilder().build(); ++ sessionFactory = metadata.buildSessionFactory(); session = sessionFactory.openSession(); session.getTransaction().begin(); @@@ -497,9 -495,9 +502,11 @@@ if (session != null && session.isOpen()) { session.close(); } ++ /* FIXME echatellier 20151205 closing sessionFactory will close serviceRegistry because ++ * the current only child (sessionFactory) is closed, but this is not what we want if (sessionFactory != null && !sessionFactory.isClosed()) { sessionFactory.close(); -- } ++ }*/ } } diff --cc topia-service-migration/src/test/java/org/nuiton/topia/migration/TopiaMigrationEngineTest.java index bb3cfae,bb3cfae..bb28bb2 --- a/topia-service-migration/src/test/java/org/nuiton/topia/migration/TopiaMigrationEngineTest.java +++ b/topia-service-migration/src/test/java/org/nuiton/topia/migration/TopiaMigrationEngineTest.java @@@ -153,7 -153,7 +153,7 @@@ public class TopiaMigrationEngineTest persistenceContext.close(); Assert.fail("Validation should have failed"); } catch (SchemaValidationTopiaException e) { -- Assert.assertEquals("Missing column: name in H2.PUBLIC.B71", e.getMessage()); ++ Assert.assertEquals("Schema-validation: missing column [name] in table [b71]", e.getMessage()); } applicationContext.close(); -- To stop receiving notification emails like this one, please contact nuiton.org SCM administrator <admin+scm@nuiton.org>.
participants (1)
-
nuiton.org scm