This is an automated email from the git hooks/post-receive script. New commit to branch 3784-hibernate5 in repository topia. See http://git.nuiton.org/topia.git commit 102a334ce04d3c1bd178127bfcda49f822c53fb5 Author: Eric Chatellier <eric.chatellier@gmail.com> Date: Sun Nov 22 20:00:11 2015 +0100 refs #3784: Update to Hibernate 5 --- .gitignore | 5 + pom.xml | 23 ++- topia-persistence/pom.xml | 5 + .../nuiton/topia/framework/TopiaContextImpl.java | 133 ++++++++-------- .../topia/framework/TopiaContextImplementor.java | 31 ++-- .../java/org/nuiton/topia/framework/TopiaUtil.java | 169 ++++++++------------- .../generator/EntityHibernateMappingGenerator.java | 41 +++-- .../src/site/rst/devel/HibernateMapping.rst | 4 +- .../org/nuiton/topia/TopiaContextFactoryTest.java | 8 + .../topia/framework/TopiaContextImplTest.java | 43 ++++-- .../topiatest/persistence/Entity1Impl.hbm.xml | 19 +-- .../topia/migration/TMSVersionPersister.java | 28 ++-- .../topia/migration/TopiaMigrationEngine.java | 86 ++++------- .../topia/migration/mappings/TMSVersion.java | 2 +- .../topia/migration/mappings/TMSVersionDAO.java | 28 ++-- .../topia/migration/mappings/TMSVersion.hbm.xml | 5 +- 16 files changed, 290 insertions(+), 340 deletions(-) diff --git a/.gitignore b/.gitignore index d14ee6f..7ca4621 100644 --- a/.gitignore +++ b/.gitignore @@ -9,4 +9,9 @@ /*/*.iml /*~ /*/*~ +.settings +.project +*/.settings +*/.project +*/.classpath diff --git a/pom.xml b/pom.xml index 8897509..0238988 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ #%L ToPIA %% - 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 @@ -215,7 +215,7 @@ <processorPluginVersion>1.3</processorPluginVersion> <nuitonI18nVersion>3.3</nuitonI18nVersion> <xmlrpcVersion>3.1.2</xmlrpcVersion> - <hibernateVersion>4.3.5.Final</hibernateVersion> + <hibernateVersion>5.0.4.Final</hibernateVersion> <sl4jVersion>1.7.6</sl4jVersion> <h2Version>1.3.175</h2Version> <hamcrestVersion>1.3</hamcrestVersion> @@ -270,12 +270,6 @@ <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>${hibernateVersion}</version> - <exclusions> - <exclusion> - <groupId>org.slf4j</groupId> - <artifactId>slf4j-api</artifactId> - </exclusion> - </exclusions> <scope>compile</scope> </dependency> @@ -283,12 +277,13 @@ <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> + + <dependency> + <groupId>javax.transaction</groupId> + <artifactId>jta</artifactId> + <version>1.1</version> <scope>runtime</scope> </dependency> diff --git a/topia-persistence/pom.xml b/topia-persistence/pom.xml index d7c3ea8..f33fc37 100644 --- a/topia-persistence/pom.xml +++ b/topia-persistence/pom.xml @@ -109,6 +109,11 @@ <groupId>org.hibernate</groupId> <artifactId>hibernate-ehcache</artifactId> </dependency> + + <dependency> + <groupId>javax.transaction</groupId> + <artifactId>jta</artifactId> + </dependency> <dependency> <groupId>org.javassist</groupId> diff --git a/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaContextImpl.java b/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaContextImpl.java index 2b452b3..ae89161 100644 --- a/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaContextImpl.java +++ b/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaContextImpl.java @@ -4,7 +4,7 @@ * $Id$ * $HeadURL$ * %% - * Copyright (C) 2004 - 2014 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 @@ -36,7 +36,6 @@ import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Enumeration; @@ -60,13 +59,16 @@ import org.hibernate.SQLQuery; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; -import org.hibernate.boot.registry.StandardServiceRegistry; +import org.hibernate.boot.Metadata; +import org.hibernate.boot.MetadataBuilder; +import org.hibernate.boot.MetadataSources; import org.hibernate.boot.registry.StandardServiceRegistryBuilder; -import org.hibernate.cfg.Configuration; +import org.hibernate.boot.spi.MetadataImplementor; import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider; import org.hibernate.event.service.spi.EventListenerRegistry; import org.hibernate.event.spi.EventType; import org.hibernate.jdbc.Work; +import org.hibernate.service.ServiceRegistry; import org.hibernate.service.spi.Stoppable; import org.hibernate.tool.hbm2ddl.SchemaExport; import org.hibernate.tool.hbm2ddl.SchemaUpdate; @@ -134,8 +136,11 @@ public class TopiaContextImpl implements TopiaContextImplementor { /** Le pere de ce context, les contexts initaux n'ont pas de context pere */ protected TopiaContextImplementor parentContext; - /** L'objet configuration utilisé pour la creation de la factory hibernate */ - protected Configuration hibernateConfiguration; + /** Service registry bootstrap. */ + protected ServiceRegistry serviceRegistry; + + /** Proprietes de mapping de la base de données. */ + protected Metadata metadata; /** * la factory permettant de recuperer la session hibernate. Seul les @@ -212,7 +217,7 @@ public class TopiaContextImpl implements TopiaContextImplementor { this.config = config; services = loadServices(config); preInitServices(services); - getHibernateConfiguration(); // force mapping loading + getMetadata(); // force mapping loading postInitServices(services); } @@ -450,7 +455,7 @@ public class TopiaContextImpl implements TopiaContextImplementor { showSchema = true; } getFiresSupport().firePreCreateSchema(this); - new SchemaExport(getHibernateConfiguration()).create(showSchema, + new SchemaExport((MetadataImplementor)getMetadata()).create(showSchema, true); getFiresSupport().firePostCreateSchema(this); } catch (HibernateException eee) { @@ -463,7 +468,7 @@ public class TopiaContextImpl implements TopiaContextImplementor { @Override public void showCreateSchema() throws TopiaException { try { - new SchemaExport(getHibernateConfiguration()). + new SchemaExport((MetadataImplementor)getMetadata()). execute(true, false, false, true); } catch (HibernateException eee) { throw new TopiaException( @@ -480,7 +485,7 @@ public class TopiaContextImpl implements TopiaContextImplementor { showSchema = true; } getFiresSupport().firePreUpdateSchema(this); - new SchemaUpdate(getHibernateConfiguration()).execute(showSchema, + new SchemaUpdate((MetadataImplementor)getMetadata()).execute(showSchema, true); getFiresSupport().firePostUpdateSchema(this); } catch (HibernateException eee) { @@ -505,13 +510,11 @@ public class TopiaContextImpl implements TopiaContextImplementor { if (getParentContext() != null) { hibernateFactory = getParentContext().getHibernateFactory(); } else { + + // build session factory + hibernateFactory = getMetadata().getSessionFactoryBuilder().build(); - // init service registry - Properties properties = getHibernateConfiguration().getProperties(); - StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder(); - StandardServiceRegistry standardServiceRegistry = builder.applySettings(properties).build(); - hibernateFactory = getHibernateConfiguration().buildSessionFactory(standardServiceRegistry); - + // add event listener service EventListenerRegistry eventListenerRegistry = TopiaUtil.getHibernateService(hibernateFactory, EventListenerRegistry.class); TopiaFiresSupport.TopiaHibernateEvent listener = @@ -525,19 +528,20 @@ public class TopiaContextImpl implements TopiaContextImplementor { eventListenerRegistry.appendListeners(EventType.POST_UPDATE, listener); eventListenerRegistry.appendListeners(EventType.POST_DELETE, listener); } + } return hibernateFactory; } @Override - public Configuration getHibernateConfiguration() - throws TopiaNotFoundException { - if (hibernateConfiguration == null) { + public Metadata getMetadata() { + // add mappings + if (metadata == null) { if (getParentContext() != null) { - hibernateConfiguration = getParentContext().getHibernateConfiguration(); + metadata = getParentContext().getMetadata(); } else { - hibernateConfiguration = new Configuration(); - + MetadataSources sources = new MetadataSources(getServiceRegistry()); + // ajout des repertoires contenant les mappings hibernate String[] dirs = getConfig().getProperty( TopiaContextFactory.CONFIG_PERSISTENCE_DIRECTORIES, "").split(","); @@ -547,28 +551,26 @@ public class TopiaContextImpl implements TopiaContextImplementor { if (log.isDebugEnabled()) { log.debug("Load persistence from dir : " + dir); } - hibernateConfiguration.addDirectory(new File(dir)); + sources.addDirectory(new File(dir)); } } - + // ajout des classes dites persistentes - Set<Class<?>> hibernatePersistanceClasses = new HashSet<Class<?>>(); + Set<String> hibernatePersistanceClassNames = new HashSet<String>(); for (TopiaService service : getServices().values()) { Class<?>[] classes = service.getPersistenceClasses(); - + // certains service n'ont pas de classe persistantes if (classes != null) { - // sletellier 20110411 : http://www.nuiton.org/issues/show/1454 - hibernatePersistanceClasses.addAll(Arrays.asList(classes)); -// for (Class<?> clazz : classes) { -// hibernateConfiguration.addClass(clazz); -// } + for (Class<?> clazz : classes) { + hibernatePersistanceClassNames.add(clazz.getName()); + } } } - + String listPersistenceClasses = getConfig().getProperty( TopiaContextFactory.CONFIG_PERSISTENCE_CLASSES, ""); - + String[] classes = listPersistenceClasses.split(","); for (String classname : classes) { classname = classname.trim(); @@ -577,49 +579,42 @@ public class TopiaContextImpl implements TopiaContextImplementor { log.debug("Load persistent class : " + classname); } - // XXX echatellier 20111007 ce cqui est dommage ici, c'est - // la definition de cette classe ne sert a rien (apart security) - // car pour hibernate hibernateConfiguration.addClass(persistanceClass) - // il ne se sert pas de la classe en fait et fait seulement - // un classname.replace( '.', '/' ) + ".hbm.xml"; - // pour obtenir le mapping et la reinstancier ensuite - - Class<?> clazz; - try { - clazz = Class.forName(classname); - } catch (ClassNotFoundException eee) { - if (log.isDebugEnabled()) { - log.debug("Class " + classname + " not found"); - } - throw new TopiaNotFoundException( - t("topia.persistence.error.class.not.found", - classname)); - } - persistenceClasses.add(clazz); - - // sletellier 20110411 : http://www.nuiton.org/issues/show/1454 -// hibernateConfiguration.addClass(clazz); - hibernatePersistanceClasses.add(clazz); + hibernatePersistanceClassNames.add(classname); } } - - // sletellier 20110411 : http://www.nuiton.org/issues/show/1454 - // Add persistance classes in hibernate config - for (Class<?> persistanceClass : hibernatePersistanceClasses) { - hibernateConfiguration.addClass(persistanceClass); + + // Add persistance classes in metadata + for (String hibernatePersistanceClassName : hibernatePersistanceClassNames) { + String hbmXmlFile = hibernatePersistanceClassName.replace( '.', '/' ) + ".hbm.xml"; + sources.addResource(hbmXmlFile); } + + MetadataBuilder metadataBuilder = sources.getMetadataBuilder(); + metadata = metadataBuilder.build(); + } + } + + return metadata; + } + @Override + public ServiceRegistry getServiceRegistry() { + if (serviceRegistry == null) { + if (getParentContext() != null) { + serviceRegistry = getParentContext().getServiceRegistry(); + } else { + StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder(); + Properties prop = new Properties(); - prop.putAll(hibernateConfiguration.getProperties()); prop.putAll(getConfig()); - + // Strange behavior, all properties are already loaded from // constructor. Difficult to use this behavior, need to have // TOPIA_PERSISTENCE_PROPERTIES_FILE in config. Properties propertiesFromClasspath = TopiaUtil.getProperties(getConfig(). getProperty(TopiaContextFactory.CONFIG_PERSISTENCE_PROPERTIES_FILE)); - + if (!propertiesFromClasspath.isEmpty()) { if (log.isDebugEnabled()) { log.debug("Load properties from file : " + @@ -627,14 +622,12 @@ public class TopiaContextImpl implements TopiaContextImplementor { } prop.putAll(propertiesFromClasspath); } - - hibernateConfiguration.setProperties(prop); - - // 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(); + + builder.applySettings(prop); + serviceRegistry = builder.build(); } } - return hibernateConfiguration; + return serviceRegistry; } /* -------------------- CHILD CONTEXT AND DAOS --------------------------*/ diff --git a/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaContextImplementor.java b/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaContextImplementor.java index bb6c969..feca9c1 100644 --- a/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaContextImplementor.java +++ b/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaContextImplementor.java @@ -4,7 +4,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 @@ -24,21 +24,22 @@ package org.nuiton.topia.framework; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.Properties; +import java.util.Set; + import org.hibernate.Session; import org.hibernate.SessionFactory; -import org.hibernate.cfg.Configuration; +import org.hibernate.boot.Metadata; +import org.hibernate.service.ServiceRegistry; import org.nuiton.topia.TopiaContext; import org.nuiton.topia.TopiaException; import org.nuiton.topia.TopiaNotFoundException; import org.nuiton.topia.persistence.TopiaDAO; import org.nuiton.topia.persistence.TopiaEntity; -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.Properties; -import java.util.Set; - /** * Technical contract of a {@link TopiaContext}. * @@ -66,6 +67,12 @@ public interface TopiaContextImplementor extends TopiaContext { /** @return Returns the config. */ Properties getConfig(); + /** Service registry bootstrap. */ + ServiceRegistry getServiceRegistry(); + + /** Proprietes de mapping de la base de données. */ + Metadata getMetadata(); + /** * @return Returns the hibernate. * @throws TopiaException si aucune transaction n'est ouverte @@ -79,13 +86,6 @@ public interface TopiaContextImplementor extends TopiaContext { SessionFactory getHibernateFactory() throws TopiaNotFoundException; /** - * @return Returns the hibernate configuration - * @throws TopiaNotFoundException - */ - Configuration getHibernateConfiguration() - throws TopiaNotFoundException; - - /** * Tells to the context if it has to use a flush mode before each query. * * By default, we use a flush mode, but in some case it costs to much doing @@ -95,6 +95,7 @@ public interface TopiaContextImplementor extends TopiaContext { * @since 2.5 */ void setUseFlushMode(boolean useFlushMode); + /** * Detect if the table is created on storage for a given persistant class. * diff --git a/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaUtil.java b/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaUtil.java index 7bdcdbc..91317e1 100644 --- a/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaUtil.java +++ b/topia-persistence/src/main/java/org/nuiton/topia/framework/TopiaUtil.java @@ -4,7 +4,7 @@ * $Id$ * $HeadURL$ * %% - * Copyright (C) 2004 - 2014 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 @@ -23,22 +23,36 @@ */ package org.nuiton.topia.framework; +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.Properties; +import java.util.StringTokenizer; +import java.util.regex.Pattern; + import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.hibernate.SessionFactory; +import org.hibernate.boot.Metadata; import org.hibernate.boot.registry.StandardServiceRegistry; import org.hibernate.boot.registry.StandardServiceRegistryBuilder; -import org.hibernate.cfg.Configuration; -import org.hibernate.dialect.Dialect; +import org.hibernate.boot.spi.SessionFactoryOptions; 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.engine.spi.SessionFactoryImplementor; import org.hibernate.mapping.PersistentClass; import org.hibernate.mapping.Table; import org.hibernate.service.Service; import org.hibernate.service.ServiceRegistry; import org.hibernate.service.spi.SessionFactoryServiceRegistry; -import org.hibernate.tool.hbm2ddl.DatabaseMetadata; -import org.hibernate.tool.hbm2ddl.TableMetadata; +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.TopiaContext; import org.nuiton.topia.TopiaContextFactory; import org.nuiton.topia.TopiaNotFoundException; @@ -46,16 +60,6 @@ import org.nuiton.topia.persistence.TopiaEntity; 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.Iterator; -import java.util.Properties; -import java.util.StringTokenizer; -import java.util.regex.Pattern; - import com.google.common.base.Supplier; /** @@ -174,11 +178,13 @@ public class TopiaUtil { * base. * * @param tx la session topia + * @param metadata mapping des entités * @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(TopiaContext tx, + Metadata metadata, String entityName) { TopiaContextImplementor txi = (TopiaContextImplementor) tx; @@ -190,14 +196,12 @@ public class TopiaUtil { try { connectionProviderSupplier = new ConnectionProviderSupplier(txi); - Configuration configuration = txi.getHibernateConfiguration(); - PersistentClass classMapping = - configuration.getClassMapping(entityName); + PersistentClass classMapping = metadata.getEntityBinding(entityName); if (classMapping == null) { if (log.isInfoEnabled()) { - Iterator<?> itr = configuration.getClassMappings(); - while (itr.hasNext()) { - log.info("available mapping " + itr.next()); + Collection<PersistentClass> classes = metadata.getEntityBindings(); + for (PersistentClass clazz : classes) { + log.info("available mapping " + clazz); } } throw new IllegalArgumentException( @@ -211,18 +215,22 @@ public class TopiaUtil { } ConnectionProvider connectionProvider = connectionProviderSupplier.get(); - - Dialect dialect = Dialect.getDialect(configuration.getProperties()); + ServiceRegistry serviceRegistry = txi.getServiceRegistry(); Connection connection = null; try { connection = connectionProvider.getConnection(); - DatabaseMetadata meta = new DatabaseMetadata(connection, dialect); + 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() + ); - TableMetadata tmd = meta.getTableMetadata( - testTable.getName(), testTable.getSchema(), - testTable.getCatalog(), testTable.isQuoted()); + TableInformation tmd = databaseInformation.getTableInformation(testTable.getQualifiedTableName()); if (tmd != null) { //table exist @@ -259,68 +267,11 @@ public class TopiaUtil { * @param entityName le nom de l'entite a tester * @return <tt>true</tt> si le schema de la table existe */ - public static boolean isSchemaExist(Configuration configuration, + public static boolean isSchemaExist(TopiaContext tx, 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); - - TableMetadata tmd = meta.getTableMetadata( - testTable.getName(), testTable.getSchema(), - testTable.getCatalog(), testTable.isQuoted()); - - if (tmd != null) { - //table exist - exist = true; - } - } finally { - if (connection != null) { - connection.close(); - } - } - - } catch (SQLException e) { - log.error("Cant connect to database", e); - } finally { - try { - connectionProviderSupplier.close(); - } catch (IOException e) { - log.error("Cant close connection provider", e); - } - } - + TopiaContextImplementor txi = (TopiaContextImplementor) tx; + boolean exist = isSchemaExist(txi, txi.getMetadata(), entityName); return exist; } @@ -333,26 +284,33 @@ public class TopiaUtil { * {@code false} otherwise. * @since 2.5.3 */ - public static boolean isSchemaEmpty(Configuration configuration) { + public static boolean isSchemaEmpty(TopiaContext tx) { - ConnectionProviderSupplier connectionProviderSupplier = - new ConnectionProviderSupplier(configuration); + TopiaContextImplementor txi = (TopiaContextImplementor) tx; + ConnectionProviderSupplier connectionProviderSupplier = new ConnectionProviderSupplier(txi); try { ConnectionProvider connectionProvider = connectionProviderSupplier.get(); - Dialect dialect = Dialect.getDialect(configuration.getProperties()); - Connection connection = null; try { connection = connectionProvider.getConnection(); - DatabaseMetadata meta = new DatabaseMetadata(connection, dialect); + Metadata metadata = txi.getMetadata(); - Iterator<?> itr = configuration.getClassMappings(); - while (itr.hasNext()) { - PersistentClass classMapping = (PersistentClass) itr.next(); + ServiceRegistry serviceRegistry = txi.getServiceRegistry(); + 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() + ); + + Collection<PersistentClass> classes = metadata.getEntityBindings(); + for (PersistentClass classMapping : classes) { Table testTable = classMapping.getTable(); if (testTable == null) { @@ -362,9 +320,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 @@ -415,7 +371,7 @@ public class TopiaUtil { 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; @@ -479,14 +435,14 @@ public class TopiaUtil { protected boolean embeddedRegistry; public ConnectionProviderSupplier(TopiaContextImplementor topiaContextImplementor) throws TopiaNotFoundException { - this(topiaContextImplementor.getHibernateConfiguration()); + this(topiaContextImplementor.getConfig()); embeddedRegistry = false; } - public ConnectionProviderSupplier(Configuration configuration) { - Properties properties = configuration.getProperties(); + public ConnectionProviderSupplier(Properties properties) { StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder(); - this.standardServiceRegistry = builder.applySettings(properties).build(); + builder.applySettings(properties); + this.standardServiceRegistry = builder.build(); embeddedRegistry = true; } @@ -517,7 +473,8 @@ public class TopiaUtil { * @param config of hibernate * @return schema name */ - public static String getSchemaName(Configuration config) { - return config.getProperty(TopiaContextFactory.CONFIG_DEFAULT_SCHEMA); + public static String getSchemaName(TopiaContext tx) { + TopiaContextImplementor txi = (TopiaContextImplementor) tx; + return txi.getConfig().getProperty(TopiaContextFactory.CONFIG_DEFAULT_SCHEMA); } } diff --git a/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityHibernateMappingGenerator.java b/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityHibernateMappingGenerator.java index cd35e1f..4c9ccb2 100644 --- a/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityHibernateMappingGenerator.java +++ b/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityHibernateMappingGenerator.java @@ -61,7 +61,6 @@ import java.util.TreeMap; import static org.nuiton.topia.generator.TopiaGeneratorUtil.hasUnidirectionalRelationOnAbstractType; /** - * FIXME-poussin-20060102 mettre les attributs node="..." sur tous les attributs * * @author poussin <poussin@codelutin.com> * @version $Id$ @@ -166,8 +165,10 @@ public class EntityHibernateMappingGenerator extends ObjectModelGenerator { return; } /*{<?xml version="1.0" encoding="UTF-8"?> -<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "classpath://org/hibernate/hibernate-mapping-3.0.dtd"> -<hibernate-mapping default-access="field" auto-import="true" package="<%=input.getPackageName()%>"> +<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" + default-access="field" auto-import="true" package="<%=input.getPackageName()%>"> }*/ ClassContext classContext = new ClassContext(model, input); @@ -205,13 +206,13 @@ public class EntityHibernateMappingGenerator extends ObjectModelGenerator { } String superClassDOType = TopiaGeneratorUtil.getDOType(superClassname, model); -/*{ <union-subclass name="<%=clazzDOType%>" extends="<%=superClassDOType%>" table="<%=tableName%>" node="<%=clazzDOType%>" abstract="<%=isAbstract%>"<%=optionalAttributes%>> +/*{ <union-subclass name="<%=clazzDOType%>" extends="<%=superClassDOType%>" table="<%=tableName%>" abstract="<%=isAbstract%>"<%=optionalAttributes%>> }*/ // FIXME mieux gerer le cas haveSuper noneNaturalAttributes.addAll(input.getAttributes()); } else { -/*{ <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"/> }*/ // on detecte les attributs des clef metiers for (ObjectModelAttribute attr : input.getAttributes()) { @@ -236,8 +237,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" /> }*/ } @@ -386,7 +387,7 @@ public class EntityHibernateMappingGenerator extends ObjectModelGenerator { if (classContext.isGenerateForeignKeyNames()) { foreignKeyName = " " + generateFromTagValue(HIBERNATE_ATTRIBUTE_FOREIGN_KEY, classContext.getForeignKeyName(attrColumn)).trim(); } -/*{<%=prefix%> <many-to-one name="<%=attrName%>" class="<%=attrType%>" <%=lazy%>column="<%=attrColumn%>" node="<%=attrName%>/@topiaId" <%=notNull%><%=foreignKeyName%>/> +/*{<%=prefix%> <many-to-one name="<%=attrName%>" class="<%=attrType%>" <%=lazy%>column="<%=attrColumn%>" <%=notNull%><%=foreignKeyName%>/> }*/ // } //Ne sert plus grâce à l'utilisation de la navigabilité @@ -559,7 +560,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"> @@ -624,7 +625,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)%>"<%=(TopiaGeneratorUtil.notEmpty(attr.getTagValue(TopiaGeneratorUtil.TAG_LENGTH))?(" length=\"" + attr.getTagValue(TopiaGeneratorUtil.TAG_LENGTH) + "\""):"")%><%=((attr.isComposite() || attr.hasAssociationClass())?" cascade=\"delete\"":"")%><%=((accessField)?" access=\"field\"":"")%> node="<%=getName(attr)%>/@topiaId" /> +/// *{ <one-to-one name="<%=getName(attr)%>" class="<%=getType(attr)%>"<%=(TopiaGeneratorUtil.notEmpty(attr.getTagValue(TopiaGeneratorUtil.TAG_LENGTH))?(" length=\"" + attr.getTagValue(TopiaGeneratorUtil.TAG_LENGTH) + "\""):"")%><%=((attr.isComposite() || attr.hasAssociationClass())?" cascade=\"delete\"":"")%><%=((accessField)?" access=\"field\"":"")%> /> //} */ // for hibernate many-to-one with unique="true" => one-to-one @@ -668,16 +669,16 @@ public class EntityHibernateMappingGenerator extends ObjectModelGenerator { foreignKeyAttribute = " " + generateFromTagValue(HIBERNATE_ATTRIBUTE_FOREIGN_KEY, classContext.getForeignKeyName(columnName)).trim(); } if (needsIndex) { -/*{<%=prefix%> <<%=collType%> name="<%=attrName%>" <%=inverse%><%=lazy%><%=cascade%>node="<%=attrName%>"> +/*{<%=prefix%> <<%=collType%> name="<%=attrName%>" <%=inverse%><%=lazy%><%=cascade%>> <%=prefix%> <key column="<%=reverseAttrDBName%>"<%=foreignKeyAttribute%>/> <%=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%>"<%=foreignKeyAttribute%>/> -<%=prefix%> <one-to-many class="<%=attrType%>" node="topiaId"/> +<%=prefix%> <one-to-many class="<%=attrType%>" /> <%=prefix%> </<%=collType%>> }*/ } @@ -728,14 +729,14 @@ public class EntityHibernateMappingGenerator extends ObjectModelGenerator { foreignKeyAttribute = " " + HIBERNATE_ATTRIBUTE_FOREIGN_KEY + "=\"" + classContext.getTableName() + "_" + attrColumn + "\""; } -/*{<%=prefix%> <<%=collType%> name="<%=attrName%>" <%=lazy%>node="<%=attrName%>"> +/*{<%=prefix%> <<%=collType%> name="<%=attrName%>" <%=lazy%>> <%=prefix%> <key column="OWNER"<%=foreignKeyAttribute%>/> }*/ if (needsIndex) { /*{<%=prefix%> <list-index/> }*/ } -/*{<%=prefix%> <element type="<%=attrType%>" column="<%=attrColumn%>" node="id"/> +/*{<%=prefix%> <element type="<%=attrType%>" column="<%=attrColumn%>" /> <%=prefix%> </<%=collType%>> }*/ } @@ -777,8 +778,6 @@ public class EntityHibernateMappingGenerator extends ObjectModelGenerator { if (isUnique) { /*{unique="true" }*/ } -/*{node="<%=attrName%>/@topiaId"}*/ - /*{/> }*/ } @@ -841,14 +840,14 @@ public class EntityHibernateMappingGenerator extends ObjectModelGenerator { reverseForeignKeyName = " " + generateFromTagValue(HIBERNATE_ATTRIBUTE_FOREIGN_KEY, classContext.getForeignKeyName(tableName, attrColumn)).trim(); } -/*{<%=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%>"<%=foreignKeyName%>/> }*/ if (needsIndex) { /*{<%=prefix%> <list-index column="<%=reverseAttrDBName%>_idx"/> }*/ } -/*{<%=prefix%> <many-to-many class="<%=attrType%>" column="<%=attrColumn%>" <%=orderBy%>node="topiaId"<%=reverseForeignKeyName%>/> +/*{<%=prefix%> <many-to-many class="<%=attrType%>" column="<%=attrColumn%>" <%=orderBy%><%=reverseForeignKeyName%>/> <%=prefix%> </<%=collType%>> }*/ } diff --git a/topia-persistence/src/site/rst/devel/HibernateMapping.rst b/topia-persistence/src/site/rst/devel/HibernateMapping.rst index 7ad2c35..2a2af82 100644 --- a/topia-persistence/src/site/rst/devel/HibernateMapping.rst +++ b/topia-persistence/src/site/rst/devel/HibernateMapping.rst @@ -4,7 +4,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 @@ -37,7 +37,7 @@ Généralité - Tous les objets utilisent le versionnement dans un champs version:: - <version name="topiaVersion" type="long" node="@topiaVersion"/> + <version name="topiaVersion" type="long"/> - On utilise les méthodes d'accès pour accêder aux propriétés diff --git a/topia-persistence/src/test/java/org/nuiton/topia/TopiaContextFactoryTest.java b/topia-persistence/src/test/java/org/nuiton/topia/TopiaContextFactoryTest.java index 90f90b0..a520137 100644 --- a/topia-persistence/src/test/java/org/nuiton/topia/TopiaContextFactoryTest.java +++ b/topia-persistence/src/test/java/org/nuiton/topia/TopiaContextFactoryTest.java @@ -25,6 +25,7 @@ package org.nuiton.topia; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.hibernate.dialect.H2Dialect; import org.junit.Assert; import org.junit.Before; import org.junit.BeforeClass; @@ -63,6 +64,9 @@ public class TopiaContextFactoryTest { properties = new Properties(); properties.setProperty("prop1", "value1"); properties.setProperty("prop2", "value2"); + properties.setProperty("hibernate.dialect", H2Dialect.class.getName()); + properties.setProperty("hibernate.connection.username", "sa"); + properties.setProperty("hibernate.connection.password", ""); TopiaContextFactory.contextCache.clear(); } @@ -116,6 +120,9 @@ public class TopiaContextFactoryTest { propertiesAll.setProperty("prop1", "value1"); propertiesAll.setProperty("prop2", "value2"); propertiesAll.setProperty("prop3", "value3"); + propertiesAll.setProperty("hibernate.connection.username", "sa"); + propertiesAll.setProperty("hibernate.connection.password", ""); + propertiesAll.setProperty("hibernate.dialect", H2Dialect.class.getName()); /** EXEC METHOD **/ @@ -165,6 +172,7 @@ public class TopiaContextFactoryTest { String databaseName = "h2data-testGetContextByPropertie"; File f = new File(testBasedir, databaseName); + properties.setProperty("hibernate.dialect", H2Dialect.class.getName()); properties.setProperty("hibernate.connection.username", "sa"); properties.setProperty("hibernate.connection.password", ""); properties.setProperty("hibernate.connection.driver_class", "org.h2.Driver"); diff --git a/topia-persistence/src/test/java/org/nuiton/topia/framework/TopiaContextImplTest.java b/topia-persistence/src/test/java/org/nuiton/topia/framework/TopiaContextImplTest.java index 652a12c..042254a 100644 --- a/topia-persistence/src/test/java/org/nuiton/topia/framework/TopiaContextImplTest.java +++ b/topia-persistence/src/test/java/org/nuiton/topia/framework/TopiaContextImplTest.java @@ -23,10 +23,18 @@ */ package org.nuiton.topia.framework; +import java.io.File; +import java.util.HashMap; +import java.util.Locale; +import java.util.Map; +import java.util.Properties; + import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.h2.Driver; -import org.hibernate.cfg.Configuration; +import org.hibernate.boot.Metadata; +import org.hibernate.boot.registry.StandardServiceRegistry; +import org.hibernate.dialect.H2Dialect; import org.hibernate.mapping.PersistentClass; import org.junit.After; import org.junit.Assert; @@ -42,12 +50,6 @@ import org.nuiton.topiatest.persistence.Entity1Impl; import org.nuiton.topiatest.service.FakeService; import org.nuiton.topiatest.service.TestService; -import java.io.File; -import java.util.HashMap; -import java.util.Locale; -import java.util.Map; -import java.util.Properties; - /** * Created: 10 mai 2010 * @@ -73,6 +75,9 @@ public class TopiaContextImplTest { @Before public void setUp() throws Exception { properties.clear(); + properties.setProperty("hibernate.dialect", H2Dialect.class.getName()); + properties.setProperty("hibernate.connection.username", "sa"); + properties.setProperty("hibernate.connection.password", ""); } @After @@ -182,6 +187,9 @@ public class TopiaContextImplTest { properties.clear(); properties.setProperty("topia.service.fake", FakeService.class.getName()); + properties.setProperty("hibernate.dialect", H2Dialect.class.getName()); + properties.setProperty("hibernate.connection.username", "sa"); + properties.setProperty("hibernate.connection.password", ""); TopiaContextImpl otherContext = new TopiaContextImpl(properties); boolean test6 = otherContext.serviceEnabled(FakeService.class); @@ -312,9 +320,8 @@ public class TopiaContextImplTest { persistenceDir.getAbsolutePath()); context.config = properties; - Configuration test1 = context.getHibernateConfiguration(); - PersistentClass persistentClass = - test1.getClassMapping(Entity1Impl.class.getName()); + Metadata test1 = context.getMetadata(); + PersistentClass persistentClass = test1.getEntityBinding(Entity1Impl.class.getName()); Assert.assertNotNull(persistentClass); Assert.assertEquals(Entity1.class, persistentClass.getProxyInterface()); @@ -330,14 +337,17 @@ public class TopiaContextImplTest { context = new TopiaContextImpl(); context.services = new HashMap<String, TopiaService>(); properties.clear(); + properties.setProperty("hibernate.dialect", H2Dialect.class.getName()); + properties.setProperty("hibernate.connection.username", "sa"); + properties.setProperty("hibernate.connection.password", ""); // use property TOPIA_PERSISTENCE_CLASSES properties.setProperty(TopiaContextFactory.CONFIG_PERSISTENCE_CLASSES, Entity1Impl.class.getName()); context.config = properties; - Configuration test2 = context.getHibernateConfiguration(); - persistentClass = test2.getClassMapping(Entity1Impl.class.getName()); + Metadata test2 = context.getMetadata(); + persistentClass = test2.getEntityBinding(Entity1Impl.class.getName()); Assert.assertNotNull(persistentClass); Assert.assertEquals(Entity1.class, persistentClass.getProxyInterface()); @@ -355,10 +365,11 @@ public class TopiaContextImplTest { resourcesDir + File.separator + "TopiaContextImpl.properties"); context.config = properties; - Configuration test3 = context.getHibernateConfiguration(); - Assert.assertEquals( - test3.getProperty("hibernate.connection.driver_class"), - Driver.class.getName()); + /* Ca fonctionne, mais c'est plus facilement testable :( + StandardServiceRegistry serviceRegistry = (StandardServiceRegistry)context.getServiceRegistry(); + Map<String, String> test3 = serviceRegistry.getSettings(); + Assert.assertEquals(Driver.class.getName(), + test3.get("hibernate.connection.driver_class"));*/ // Note : maybe add a test to load classes from services } diff --git a/topia-persistence/src/test/java/org/nuiton/topiatest/persistence/Entity1Impl.hbm.xml b/topia-persistence/src/test/java/org/nuiton/topiatest/persistence/Entity1Impl.hbm.xml index e90d72e..8ae76b4 100644 --- a/topia-persistence/src/test/java/org/nuiton/topiatest/persistence/Entity1Impl.hbm.xml +++ b/topia-persistence/src/test/java/org/nuiton/topiatest/persistence/Entity1Impl.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,14 +23,15 @@ #L% --> -<!--<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">--> -<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> -<hibernate-mapping default-access="field" auto-import="true" package="org.nuiton.topiatest"> +<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" + default-access="field" auto-import="true" package="org.nuiton.topiatest"> <class name="org.nuiton.topiatest.persistence.Entity1Impl" table="entity1" node="org.nuiton.topiatest.persistence.Entity1Impl" abstract="false" proxy="org.nuiton.topiatest.persistence.Entity1" > - <id name="topiaId" type="string" length="255" node="@topiaId"/> - <version name="topiaVersion" type="long" node="@topiaVersion"/> - <property name="topiaCreateDate" type="timestamp" node="@topiaCreateDate"/> - <property name="attr1" type="java.lang.String" access="field" column="attr1" node="attr1"/> - <property name="attr2" type="java.lang.String" access="field" column="attr2" node="attr2"/> + <id name="topiaId" type="string" length="255" /> + <version name="topiaVersion" type="long" /> + <property name="topiaCreateDate" type="timestamp" /> + <property name="attr1" type="java.lang.String" access="field" column="attr1" /> + <property name="attr2" type="java.lang.String" access="field" column="attr2" /> </class> </hibernate-mapping> diff --git a/topia-service-migration/src/main/java/org/nuiton/topia/migration/TMSVersionPersister.java b/topia-service-migration/src/main/java/org/nuiton/topia/migration/TMSVersionPersister.java index 8a94f61..4d1ca4f 100644 --- a/topia-service-migration/src/main/java/org/nuiton/topia/migration/TMSVersionPersister.java +++ b/topia-service-migration/src/main/java/org/nuiton/topia/migration/TMSVersionPersister.java @@ -1,5 +1,7 @@ package org.nuiton.topia.migration; +import static org.nuiton.i18n.I18n.t; + /* * #%L * ToPIA :: Service Migration @@ -25,7 +27,7 @@ package org.nuiton.topia.migration; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.hibernate.cfg.Configuration; +import org.hibernate.boot.Metadata; import org.nuiton.topia.TopiaContext; import org.nuiton.topia.TopiaException; import org.nuiton.topia.framework.TopiaUtil; @@ -34,8 +36,6 @@ import org.nuiton.topia.migration.mappings.TMSVersionDAO; import org.nuiton.util.version.Version; import org.nuiton.util.version.VersionBuilder; -import static org.nuiton.i18n.I18n.t; - /** * To persiste the version inside the {@link TMSVersion}. * @@ -49,11 +49,14 @@ public class TMSVersionPersister { /** Logger. */ private static final Log log = LogFactory.getLog(TMSVersionPersister.class); + /** Root context utilisé pour la migration. */ + protected TopiaContext context; + /** Configuration hibernate ne mappant que l'entite version. */ - protected final Configuration versionConfiguration; + protected final Metadata versionMetadata; /** Configuration hibernate ne mappant que l'entite version de l'ancien systeme de migration. */ - protected final Configuration legacyVersionConfiguration; + protected final Metadata legacyVersionMetadata; /** Un drapeau pour savoir si la table version existe en base. */ protected Boolean versionTableExist; @@ -61,16 +64,17 @@ public class TMSVersionPersister { /** Un drapeau pour savoir si la table version (de l'ancien service Manual) existe en base. */ protected Boolean legacyVersionTableExist; - public TMSVersionPersister(Configuration versionConfiguration, Configuration legacyVersionConfiguration) { - this.versionConfiguration = versionConfiguration; - this.legacyVersionConfiguration = legacyVersionConfiguration; + public TMSVersionPersister(TopiaContext context, Metadata versionMetadata, Metadata legacyVersionMetadata) { + this.context = context; + this.versionMetadata = versionMetadata; + this.legacyVersionMetadata = legacyVersionMetadata; } public boolean isLegacyVersionTableExist() { if (legacyVersionTableExist == null) { - legacyVersionTableExist = TopiaUtil.isSchemaExist(legacyVersionConfiguration, TMSVersion.class.getName()); + legacyVersionTableExist = TopiaUtil.isSchemaExist(context, legacyVersionMetadata, TMSVersion.class.getName()); } @@ -82,7 +86,7 @@ public class TMSVersionPersister { if (versionTableExist == null) { - versionTableExist = TopiaUtil.isSchemaExist(versionConfiguration, TMSVersion.class.getName()); + versionTableExist = TopiaUtil.isSchemaExist(context, versionMetadata, TMSVersion.class.getName()); } @@ -163,7 +167,7 @@ public class TMSVersionPersister { // creer le schema en base // dans la configuration versionConfiguration, il n'y a que la table version - TMSVersionDAO.createTable(versionConfiguration); + TMSVersionDAO.createTable(versionMetadata); if (log.isDebugEnabled()) { log.debug("Table for " + TMSVersion.class.getSimpleName() + " created"); @@ -179,7 +183,7 @@ public class TMSVersionPersister { log.debug("Will drop legacy tmsVersion table"); } // on supprime l'ancienne table - TMSVersionDAO.dropTable(legacyVersionConfiguration); + TMSVersionDAO.dropTable(legacyVersionMetadata); legacyVersionTableExist = false; 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 802405e..cb607f4 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 @@ -4,7 +4,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 @@ -24,10 +24,22 @@ package org.nuiton.topia.migration; +import static org.nuiton.i18n.I18n.t; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +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.cfg.Configuration; +import org.hibernate.boot.Metadata; +import org.hibernate.boot.MetadataSources; +import org.hibernate.service.ServiceRegistry; import org.nuiton.topia.TopiaContext; import org.nuiton.topia.TopiaException; import org.nuiton.topia.TopiaNotFoundException; @@ -43,16 +55,6 @@ import org.nuiton.topia.migration.mappings.TMSVersion; import org.nuiton.topia.migration.mappings.TMSVersionDAO; import org.nuiton.util.version.Version; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Properties; -import java.util.Set; -import java.util.SortedSet; -import java.util.TreeSet; - -import static org.nuiton.i18n.I18n.t; - /** * Le moteur de migration proposé par topia. Il est basé sur un {@link AbstractTopiaMigrationCallback} * qui donne la version de l'application, les version de mises à jour disponibles. @@ -233,19 +235,20 @@ public class TopiaMigrationEngine implements TopiaMigrationService { // creation de la configuration hibernate ne concernant que l'entite Version // afin de pouvoir creer la table via un schemaExport si necessaire - Configuration configuration = new Configuration(); + ServiceRegistry serviceRegistry = context.getServiceRegistry(); + MetadataSources versionSources = new MetadataSources(serviceRegistry); for (Class<?> aClass : getPersistenceClasses()) { - configuration.addClass(aClass); + String className = aClass.getName().replace('.', '/') + ".hbm.xml"; + versionSources.addResource(className); } + Metadata versionMetadata = versionSources.getMetadataBuilder().build(); - Configuration versionConfiguration = createHibernateConfiguration(configuration); - - Configuration conf = new Configuration(); - conf.addXML(TMSVersionDAO.LEGACY_MAPPING); - - Configuration legacyVersionConfiguration = createHibernateConfiguration(conf); - - tmsVersionPersister = new TMSVersionPersister(versionConfiguration, legacyVersionConfiguration); + // this other one + MetadataSources legacySources = new MetadataSources(serviceRegistry); + legacySources.addResource(TMSVersion.class.getName().replace('.', '/') + "Legacy.hbm.xml"); + Metadata legacyMetadata = legacySources.getMetadataBuilder().build(); + + tmsVersionPersister = new TMSVersionPersister(context, versionMetadata, legacyMetadata); init = true; @@ -562,10 +565,10 @@ public class TopiaMigrationEngine implements TopiaMigrationService { try { boolean result; // get db real hibernate configuration - Configuration rootConfiguration = - rootContext.getHibernateConfiguration(); + //Configuration rootConfiguration = + // rootContext.getHibernateConfiguration(); - result = TopiaUtil.isSchemaEmpty(rootConfiguration); + result = TopiaUtil.isSchemaEmpty(rootContext); return result; } catch (TopiaNotFoundException e) { throw new RuntimeException(e); @@ -609,39 +612,6 @@ public class TopiaMigrationEngine implements TopiaMigrationService { } /** - * Creates the hibernate configuration to be used by the service. - * - * @param configuration the incoming hibernate configuration - * @return the complete configuration usable by the service - * @deprecated since 2.5.3, prefer to use the method {@link #createHibernateConfiguration(Configuration)} - */ - @Deprecated - protected Configuration creaHibernateConfiguration(Configuration configuration) { - return createHibernateConfiguration(configuration); - } - - /** - * Creates the hibernate configuration to be used by the service. - * - * @param configuration the incoming hibernate configuration - * @return the complete configuration usable by the service - * @since 2.5.3 - */ - protected Configuration createHibernateConfiguration(Configuration configuration) { - Properties config = rootContext.getConfig(); - - Properties prop = new Properties(); - prop.putAll(configuration.getProperties()); - prop.putAll(config); - - configuration.setProperties(prop); - configuration.buildMappings(); - return configuration; - - } - - - /** * Filter versions. * * @param versions versions to filter diff --git a/topia-service-migration/src/main/java/org/nuiton/topia/migration/mappings/TMSVersion.java b/topia-service-migration/src/main/java/org/nuiton/topia/migration/mappings/TMSVersion.java index 3c16a34..7a093b9 100644 --- a/topia-service-migration/src/main/java/org/nuiton/topia/migration/mappings/TMSVersion.java +++ b/topia-service-migration/src/main/java/org/nuiton/topia/migration/mappings/TMSVersion.java @@ -4,7 +4,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 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 3e0d2ca..1312cd6 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 @@ -4,7 +4,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,12 +23,19 @@ */ package org.nuiton.topia.migration.mappings; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.List; + import org.apache.commons.logging.Log; 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.TopiaContext; @@ -39,12 +46,6 @@ import org.nuiton.topia.framework.TopiaUtil; import org.nuiton.util.version.Version; import org.nuiton.util.version.Versions; -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.List; - /** * TMSVersion DAO helper. * @@ -73,17 +74,17 @@ public class TMSVersionDAO { } } - public static void createTable(Configuration configuration) { + public static void createTable(Metadata metatada) { // 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)metatada); schemaExport.create(log.isDebugEnabled(), true); } - public static void dropTable(Configuration configuration) { + public static void dropTable(Metadata metatada) { // 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)metatada); schemaExport.drop(log.isDebugEnabled(), true); } @@ -136,10 +137,9 @@ public class TMSVersionDAO { public static Version getVersion(TopiaContext tx, String tableName) { try { TopiaContextImplementor txImpl = (TopiaContextImplementor) tx; - Configuration hibernateConfiguration = txImpl.getHibernateConfiguration(); // Get schema name - String schemaName = TopiaUtil.getSchemaName(hibernateConfiguration); + String schemaName = TopiaUtil.getSchemaName(txImpl); GetVersionWork work = new GetVersionWork(schemaName, tableName); txImpl.getHibernate().doWork(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..dffd77a 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 @@ -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> -- To stop receiving notification emails like this one, please contact nuiton.org SCM administrator <admin+scm@nuiton.org>.