Index: topia2/src/java/org/codelutin/topia/framework/TopiaContextImpl.java diff -u topia2/src/java/org/codelutin/topia/framework/TopiaContextImpl.java:1.12 topia2/src/java/org/codelutin/topia/framework/TopiaContextImpl.java:1.13 --- topia2/src/java/org/codelutin/topia/framework/TopiaContextImpl.java:1.12 Mon Jan 30 15:09:36 2006 +++ topia2/src/java/org/codelutin/topia/framework/TopiaContextImpl.java Fri Feb 10 14:01:25 2006 @@ -23,9 +23,9 @@ * * @author poussin * - * @version $Revision: 1.12 $ + * @version $Revision: 1.13 $ * - * Last update: $Date: 2006/01/30 15:09:36 $ by : $Author: thimel $ + * Last update: $Date: 2006/02/10 14:01:25 $ by : $Author: bpoussin $ */ package org.codelutin.topia.framework; @@ -89,6 +89,7 @@ import org.hibernate.event.PreLoadEventListener; import org.hibernate.event.PreUpdateEvent; import org.hibernate.event.PreUpdateEventListener; +import org.hibernate.tool.hbm2ddl.SchemaExport; /** * Le TopiaContextImpl est le point d'entre pour acceder aux donnees. Il est @@ -129,6 +130,11 @@ protected TopiaContextImplementor parentContext = null; /** + * L'objet configuration utilisé pour la creation de la factory hibernate + */ + protected Configuration hibernateConfiguration = null; + + /** * la factory permettant de recuperer la session hibernate. Seul les * TopiaContextImpl initiaux contiennent un hibernateFactory */ @@ -236,6 +242,17 @@ return config; } + /* (non-Javadoc) + * @see org.codelutin.topia.TopiaContext#createSchema() + */ + public void createSchema() throws TopiaException { + try { + new SchemaExport(getHibernateConfiguration()).create(false, true); + } catch (HibernateException eee) { + throw new TopiaException("Can't create database schema", eee); + } + } + /* * (non-Javadoc) * @@ -259,49 +276,60 @@ if (getParentContext() != null) { hibernateFactory = getParentContext().getHibernateFactory(); } else { - Configuration cfg = new Configuration(); + hibernateFactory = getHibernateConfiguration().buildSessionFactory(); + } + } + return hibernateFactory; + } + + public Configuration getHibernateConfiguration() throws TopiaNotFoundException { + if (hibernateConfiguration == null) { + if (getParentContext() != null) { + hibernateConfiguration = getParentContext().getHibernateConfiguration(); + } else { + hibernateConfiguration = new Configuration(); // Ajout du listeners pour les events TopiaHibernateEvent listener = new TopiaHibernateEvent(this); - PreLoadEventListener[] preLoadEventListeners = cfg + PreLoadEventListener[] preLoadEventListeners = hibernateConfiguration .getEventListeners().getPreLoadEventListeners(); preLoadEventListeners = ArrayUtil.concatElems( preLoadEventListeners, listener); - PreUpdateEventListener[] preUpdateEventListeners = cfg + PreUpdateEventListener[] preUpdateEventListeners = hibernateConfiguration .getEventListeners().getPreUpdateEventListeners(); preUpdateEventListeners = ArrayUtil.concatElems( preUpdateEventListeners, listener); - PreDeleteEventListener[] preDeleteEventListeners = cfg + PreDeleteEventListener[] preDeleteEventListeners = hibernateConfiguration .getEventListeners().getPreDeleteEventListeners(); preDeleteEventListeners = ArrayUtil.concatElems( preDeleteEventListeners, listener); - PostLoadEventListener[] postLoadEventListeners = cfg + PostLoadEventListener[] postLoadEventListeners = hibernateConfiguration .getEventListeners().getPostLoadEventListeners(); postLoadEventListeners = ArrayUtil.concatElems( postLoadEventListeners, listener); - PostUpdateEventListener[] postUpdateEventListeners = cfg + PostUpdateEventListener[] postUpdateEventListeners = hibernateConfiguration .getEventListeners().getPostUpdateEventListeners(); postUpdateEventListeners = ArrayUtil.concatElems( postUpdateEventListeners, listener); - PostDeleteEventListener[] postDeleteEventListeners = cfg + PostDeleteEventListener[] postDeleteEventListeners = hibernateConfiguration .getEventListeners().getPostDeleteEventListeners(); postDeleteEventListeners = ArrayUtil.concatElems( postDeleteEventListeners, listener); - cfg.getEventListeners().setPreLoadEventListeners( + hibernateConfiguration.getEventListeners().setPreLoadEventListeners( preLoadEventListeners); - cfg.getEventListeners().setPreUpdateEventListeners( + hibernateConfiguration.getEventListeners().setPreUpdateEventListeners( preUpdateEventListeners); - cfg.getEventListeners().setPreDeleteEventListeners( + hibernateConfiguration.getEventListeners().setPreDeleteEventListeners( preDeleteEventListeners); - cfg.getEventListeners().setPostLoadEventListeners( + hibernateConfiguration.getEventListeners().setPostLoadEventListeners( postLoadEventListeners); - cfg.getEventListeners().setPostUpdateEventListeners( + hibernateConfiguration.getEventListeners().setPostUpdateEventListeners( postUpdateEventListeners); - cfg.getEventListeners().setPostDeleteEventListeners( + hibernateConfiguration.getEventListeners().setPostDeleteEventListeners( postDeleteEventListeners); // ajout des repertoires contenant les mappings hibernate @@ -310,7 +338,7 @@ for (String dir : dirs) { dir = dir.trim(); if (!"".equals(dir)) { - cfg.addDirectory(new File(dir)); + hibernateConfiguration.addDirectory(new File(dir)); } } @@ -328,23 +356,21 @@ "Persistent class " + classname + " not found"); } - cfg.addClass(clazz); + hibernateConfiguration.addClass(clazz); } } Properties prop = new Properties(); - prop.putAll(cfg.getProperties()); + prop.putAll(hibernateConfiguration.getProperties()); prop.putAll(getConfig()); prop.putAll(TopiaUtil.getProperties(getConfig().getProperty( TOPIA_PERSISTENCE_PROPERTIES_FILE))); - cfg.setProperties(prop); - - hibernateFactory = cfg.buildSessionFactory(); + hibernateConfiguration.setProperties(prop); } } - return hibernateFactory; + return hibernateConfiguration; } - + /* * (non-Javadoc) * @@ -826,6 +852,13 @@ if (log.isDebugEnabled()) { log.debug("fireOnCreated: " + entity); } + if (entity instanceof TopiaEntityAbstract) { + TopiaEntityAbstract entityAbstract = (TopiaEntityAbstract) entity; + //On ne rattache l'entité à un contexte que si elle n'en a pas + if (entityAbstract.getTopiaContext() == null) { + entityAbstract.setTopiaContext(this); + } + } try { TopiaEntityEvent event = new TopiaEntityEvent(this, entity); transactionEvents.add(new TopiaTransactionEvent(this, entityClass, id)); @@ -844,7 +877,7 @@ */ public void fireOnUpdated(Class entityClass, Object id, Object entity) { if (log.isDebugEnabled()) { - log.debug("fireOnUpdated: " + entity); + log.debug("fireOnUpdated: (" + entityClass + ")" + entity); } try { TopiaEntityEvent event = new TopiaEntityEvent(this, entity); Index: topia2/src/java/org/codelutin/topia/framework/TopiaContextImplementor.java diff -u topia2/src/java/org/codelutin/topia/framework/TopiaContextImplementor.java:1.4 topia2/src/java/org/codelutin/topia/framework/TopiaContextImplementor.java:1.5 --- topia2/src/java/org/codelutin/topia/framework/TopiaContextImplementor.java:1.4 Mon Jan 30 14:38:53 2006 +++ topia2/src/java/org/codelutin/topia/framework/TopiaContextImplementor.java Fri Feb 10 14:01:25 2006 @@ -23,10 +23,10 @@ * Created: 3 janv. 2006 21:27:24 * * @author poussin - * @version $Revision: 1.4 $ + * @version $Revision: 1.5 $ * - * Last update: $Date: 2006/01/30 14:38:53 $ - * by : $Author: thimel $ + * Last update: $Date: 2006/02/10 14:01:25 $ + * by : $Author: bpoussin $ */ package org.codelutin.topia.framework; @@ -43,6 +43,7 @@ import org.codelutin.util.ListenerSet; import org.hibernate.Session; import org.hibernate.SessionFactory; +import org.hibernate.cfg.Configuration; /** * @author poussin @@ -81,6 +82,12 @@ public SessionFactory getHibernateFactory() throws TopiaNotFoundException; /** + * @return Returns the hibernate configuration + * @throws TopiaNotFoundException + */ + public Configuration getHibernateConfiguration() throws TopiaNotFoundException; + + /** * Get DAO for specified class. If Specialized DAO exists then it returned * otherwize TopiaDAO<entityClass> is returned *