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 bb97226bfa2f62be3b3a6aa63f81b6cbbd65f3f1 Author: Eric Chatellier <chatellier@codelutin.com> Date: Sat Dec 5 20:59:14 2015 +0100 refs #3666: Update to Hibernate 5 --- pom.xml | 27 +- topia-it/pom.xml | 4 +- .../topia/it/legacy/framework/TopiaUtilTest.java | 48 +-- 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 | 323 ++++++--------------- 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 ++- 27 files changed, 448 insertions(+), 588 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-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..68a1107 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,17 @@ 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); + 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 +457,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 +487,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>.