branch 3784-hibernate5 updated (c63c063 -> 102a334)
This is an automated email from the git hooks/post-receive script. New change to branch 3784-hibernate5 in repository topia. See http://git.nuiton.org/topia.git from c63c063 refs #3784: Update to Hibernate 5 new 102a334 refs #3784: Update to Hibernate 5 The 1 revisions listed above as "new" are entirely new to this repository and will be described in separate emails. The revisions listed as "adds" were already present in the repository and have only been added to this reference. Detailed log of new commits: commit 102a334ce04d3c1bd178127bfcda49f822c53fb5 Author: Eric Chatellier <eric.chatellier@gmail.com> Date: Sun Nov 22 20:00:11 2015 +0100 refs #3784: Update to Hibernate 5 Summary of changes: .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(-) -- To stop receiving notification emails like this one, please contact nuiton.org SCM administrator <admin+scm@nuiton.org>.
This is an automated email from the git hooks/post-receive script. New commit to branch 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>.
participants (1)
-
nuiton.org scm