r2899 - in trunk: topia-persistence/src/main/java/org/nuiton/topia topia-persistence/src/main/java/org/nuiton/topia/persistence topia-templates/src/main/java/org/nuiton/topia/templates
Author: athimel Date: 2013-11-27 19:18:10 +0100 (Wed, 27 Nov 2013) New Revision: 2899 Url: http://nuiton.org/projects/topia/repository/revisions/2899 Log: fixes #2925 AbstractTopiaDao is not dependent anymore of the JPA implementation choosen Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/AbstractTopiaPersistenceContext.java trunk/topia-persistence/src/main/java/org/nuiton/topia/HibernateTopiaJpaSupport.java trunk/topia-persistence/src/main/java/org/nuiton/topia/TopiaJpaSupport.java trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/AbstractTopiaDao.java trunk/topia-templates/src/main/java/org/nuiton/topia/templates/EntityDaoTransformer.java Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/AbstractTopiaPersistenceContext.java =================================================================== --- trunk/topia-persistence/src/main/java/org/nuiton/topia/AbstractTopiaPersistenceContext.java 2013-11-27 17:13:23 UTC (rev 2898) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/AbstractTopiaPersistenceContext.java 2013-11-27 18:18:10 UTC (rev 2899) @@ -301,7 +301,7 @@ if (dao instanceof AbstractTopiaDao) { AbstractTopiaDao abstractTopiaDao = (AbstractTopiaDao) dao; - abstractTopiaDao.init(hibernateSupport, jpaSupport, sqlSupport, listenableSupport, topiaIdFactory, firesSupport, this); + abstractTopiaDao.init(jpaSupport, sqlSupport, listenableSupport, topiaIdFactory, firesSupport, this); } daoCache.put(entityClass, dao); Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/HibernateTopiaJpaSupport.java =================================================================== --- trunk/topia-persistence/src/main/java/org/nuiton/topia/HibernateTopiaJpaSupport.java 2013-11-27 17:13:23 UTC (rev 2898) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/HibernateTopiaJpaSupport.java 2013-11-27 18:18:10 UTC (rev 2899) @@ -58,7 +58,7 @@ * <p/> * The normal usage is to says yes (that's why the default value is * {@code true}), in that case whebn doing queries (says in method - * {@link #findAll(String, Object...)} or {@link #find(String, int, int, Object...)}) + * {@link #findAll(String, Map<String, Object>)} or {@link #find(String, int, int, Map<String, Object>)}) * it will use the flush mode {@link FlushMode#AUTO}). * <p/> * But sometimes, when doing a lot of queries (for some imports for example), @@ -74,6 +74,10 @@ this.firesSupport = firesSupport; } + public TopiaHibernateSupport getHibernateSupport() { + return hibernateSupport; + } + @Override public void setUseFlushMode(boolean useFlushMode) { this.useFlushMode = useFlushMode; @@ -180,4 +184,40 @@ } } + @Override + public void save(Object object) { + try { + hibernateSupport.getHibernateSession().save(object); + } catch (HibernateException eee) { + throw new TopiaException("Unable to 'save' instance", eee); + } + } + + @Override + public void update(Object object) { + try { + hibernateSupport.getHibernateSession().update(object); + } catch (HibernateException eee) { + throw new TopiaException("Unable to 'update' instance", eee); + } + } + + @Override + public void saveOrUpdate(Object object) { + try { + hibernateSupport.getHibernateSession().saveOrUpdate(object); + } catch (HibernateException eee) { + throw new TopiaException("Unable to 'saveOrUpdate' instance", eee); + } + } + + @Override + public void delete(Object object) { + try { + hibernateSupport.getHibernateSession().delete(object); + } catch (HibernateException eee) { + throw new TopiaException("Unable to 'delete' instance", eee); + } + } + } // HibernateTopiaJpaSupport Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/TopiaJpaSupport.java =================================================================== --- trunk/topia-persistence/src/main/java/org/nuiton/topia/TopiaJpaSupport.java 2013-11-27 17:13:23 UTC (rev 2898) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/TopiaJpaSupport.java 2013-11-27 18:18:10 UTC (rev 2899) @@ -33,7 +33,6 @@ * @author Arnaud Thimel <thimel@codelutin.com> * @since 3.0 */ -// TODO AThimel 02/08/13 I think we need another name public interface TopiaJpaSupport { /** @@ -103,6 +102,45 @@ * @param useFlushMode the new value to set * @since 2.5 */ - void setUseFlushMode(boolean useFlushMode); // XXX AThimel 27/09/13 Maybe this method has to be renamed + void setUseFlushMode(boolean useFlushMode); + /** + * Persist the given transient instance, first assigning a generated identifier. This method is JPA implementation + * independent. + * <p/> + * This method is "inspired" of the Hibernate's Session#save method. + * + * @param object a transient instance of a persistent class + */ + void save(Object object); + + /** + * Update the persistent instance with the identifier of the given detached instance. + * <p/> + * This method is "inspired" of the Hibernate's Session#update method. + * + * @param object a detached instance containing updated state + */ + void update(Object object); + + /** + * Either {@link #save(Object)} or {@link #update(Object)} the given instance. + * <p/> + * This method is "inspired" of the Hibernate's Session#saveOrUpdate method. + * + * @param object a transient or detached instance containing new or updated state + * @see #save(java.lang.Object) + * @see #update(Object object) + */ + void saveOrUpdate(Object object); + + /** + * Remove a persistent instance. + * <p/> + * This method is "inspired" of the Hibernate's Session#delete method. + * + * @param object the instance to be removed + */ + void delete(Object object); + } Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/AbstractTopiaDao.java =================================================================== --- trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/AbstractTopiaDao.java 2013-11-27 17:13:23 UTC (rev 2898) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/persistence/AbstractTopiaDao.java 2013-11-27 18:18:10 UTC (rev 2899) @@ -45,12 +45,9 @@ import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.hibernate.HibernateException; -import org.hibernate.metadata.ClassMetadata; import org.nuiton.topia.QueryMissingOrderException; import org.nuiton.topia.TopiaDaoSupplier; import org.nuiton.topia.TopiaException; -import org.nuiton.topia.TopiaHibernateSupport; import org.nuiton.topia.TopiaJpaSupport; import org.nuiton.topia.TopiaListenableSupport; import org.nuiton.topia.TopiaNoResultException; @@ -72,21 +69,20 @@ import java.util.Set; /** - * Cette classe permet d'avoir un ensemble de méthode implantée de façon - * standard et plus spécifiquement pour Hibernate. + * This class has the common methods usable for each Dao managed by Topia. It is not JPA implementation dependent, it + * only relies on {@link TopiaJpaSupport}. * <p/> - * Certains accès à Hibernate sont tout de même fait ici, car on a pris le choix - * de se baser entièrement sur hibernate pour la persistence, et il est ainsi - * possible d'accèder au meta information hibernate sur les classes lorque l'on - * en a besoin. + * This class is directly extended by the GeneratedXyzTopiaDao which groups all the Xyz specific methods. + * <p/> + * Instances are created bt the model's specific {@link org.nuiton.topia.TopiaPersistenceContext}, which implements the + * {@link TopiaDaoSupplier} contract. * - * @param <E> le type de l'entite + * @param <E> the managed entity type * @author bpoussin <poussin@codelutin.com> - * @version $Id$ + * @author Arnaud Thimel <thimel@codelutin.com> */ public abstract class AbstractTopiaDao<E extends TopiaEntity> implements TopiaDao<E> { - /** to use log facility, just put in your code: log.info(\"...\"); */ private static Log log = LogFactory.getLog(AbstractTopiaDao.class); /** @@ -96,9 +92,6 @@ */ protected int batchSize = 1000; - @Deprecated // Should not be used here, cf http://nuiton.org/issues/2925 - protected TopiaHibernateSupport topiaHibernateSupport; - protected TopiaJpaSupport topiaJpaSupport; protected TopiaSqlSupport topiaSqlSupport; @@ -120,7 +113,6 @@ * method just after. */ public void init( - TopiaHibernateSupport topiaHibernateSupport, TopiaJpaSupport topiaJpaSupport, TopiaSqlSupport topiaSqlSupport, TopiaListenableSupport topiaListenableSupport, @@ -130,7 +122,6 @@ if (log.isDebugEnabled()) { log.debug("init dao for " + getEntityClass()); } - this.topiaHibernateSupport = topiaHibernateSupport; this.topiaJpaSupport = topiaJpaSupport; this.topiaSqlSupport = topiaSqlSupport; this.topiaListenableSupport = topiaListenableSupport; @@ -204,27 +195,23 @@ @Override public E create(E entity) { - try { - // first set topiaId - if (StringUtils.isBlank(entity.getTopiaId())) { + // first set topiaId + if (StringUtils.isBlank(entity.getTopiaId())) { - // only set id if not already on - String topiaId = topiaIdFactory.newTopiaId(getEntityClass(), entity); - entity.setTopiaId(topiaId); - } + // only set id if not already on + String topiaId = topiaIdFactory.newTopiaId(getEntityClass(), entity); + entity.setTopiaId(topiaId); + } - if (entity instanceof TopiaEntityContextable) { - TopiaEntityContextable contextable = (TopiaEntityContextable) entity; - contextable.setTopiaDAOSupplier(this.topiaDaoSupplier); - } - - // save entity - topiaHibernateSupport.getHibernateSession().save(entity); - topiaFiresSupport.warnOnCreateEntity(entity); - return entity; - } catch (HibernateException eee) { - throw new TopiaException(eee); + if (entity instanceof TopiaEntityContextable) { + TopiaEntityContextable contextable = (TopiaEntityContextable) entity; + contextable.setTopiaDAOSupplier(this.topiaDaoSupplier); } + + // save entity + topiaJpaSupport.save(entity); + topiaFiresSupport.warnOnCreateEntity(entity); + return entity; } @Override @@ -279,13 +266,9 @@ @Override public E update(E entity) { - try { - topiaHibernateSupport.getHibernateSession().saveOrUpdate(entity); - topiaFiresSupport.warnOnUpdateEntity(entity); - return entity; - } catch (HibernateException eee) { - throw new TopiaException(eee); - } + topiaJpaSupport.saveOrUpdate(entity); + topiaFiresSupport.warnOnUpdateEntity(entity); + return entity; } @Override @@ -298,13 +281,9 @@ @Override public void delete(E entity) { - try { - topiaHibernateSupport.getHibernateSession().delete(entity); - entity.notifyDeleted(); - topiaFiresSupport.warnOnDeleteEntity(entity); - } catch (HibernateException eee) { - throw new TopiaException(eee); - } + topiaJpaSupport.delete(entity); + entity.notifyDeleted(); + topiaFiresSupport.warnOnDeleteEntity(entity); } @Override @@ -672,22 +651,21 @@ return result; } - /** - * package locale method because this is hibernate specific method and - * we don't want expose it. - * - * @return the meta-data of the entity - * @throws org.nuiton.topia.TopiaException if any pb - */ - protected ClassMetadata getClassMetadata() { - ClassMetadata meta = topiaHibernateSupport.getHibernateFactory() - .getClassMetadata(getEntityClass()); - if (meta == null) { - meta = topiaHibernateSupport.getHibernateFactory().getClassMetadata( - getTopiaEntityEnum().getImplementationFQN()); - } - return meta; - } +// /** +// * package locale method because this is hibernate specific method and +// * we don't want expose it. +// * +// * @return the meta-data of the entity +// * @throws org.nuiton.topia.TopiaException if any pb +// */ +// protected ClassMetadata getClassMetadata() { +// ClassMetadata meta = topiaHibernateSupport.getHibernateFactory().getClassMetadata(getEntityClass()); +// if (meta == null) { +// String implementationFQN = getTopiaEntityEnum().getImplementationFQN(); +// meta = topiaHibernateSupport.getHibernateFactory().getClassMetadata(implementationFQN); +// } +// return meta; +// } public static class FindAllIterator<E extends TopiaEntity, R> implements Iterator<R> { @@ -1032,14 +1010,12 @@ @Override public List<String> findAllIds() { - // XXX brendan 30/09/13 does this truely work ? String hqlWithSelectClause = "select topiaId " + hql; return topiaDAO.findAll(hqlWithSelectClause, hqlParameters, String.class); } @Override public List<String> findIds(int startIndex, int endIndex) { - // XXX brendan 30/09/13 does this truely work ? String hqlWithSelectClause = "select topiaId " + hql; return topiaDAO.find(hqlWithSelectClause, hqlParameters, String.class, startIndex, endIndex); } Modified: trunk/topia-templates/src/main/java/org/nuiton/topia/templates/EntityDaoTransformer.java =================================================================== --- trunk/topia-templates/src/main/java/org/nuiton/topia/templates/EntityDaoTransformer.java 2013-11-27 17:13:23 UTC (rev 2898) +++ trunk/topia-templates/src/main/java/org/nuiton/topia/templates/EntityDaoTransformer.java 2013-11-27 18:18:10 UTC (rev 2899) @@ -33,6 +33,7 @@ import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.hibernate.Session; import org.nuiton.eugene.GeneratorUtil; import org.nuiton.eugene.java.JavaGeneratorUtil; import org.nuiton.eugene.java.ObjectModelTransformerToJava; @@ -45,7 +46,8 @@ import org.nuiton.eugene.models.object.ObjectModelInterface; import org.nuiton.eugene.models.object.ObjectModelJavaModifier; import org.nuiton.eugene.models.object.ObjectModelOperation; -import org.nuiton.topia.TopiaException; +import org.nuiton.topia.HibernateTopiaJpaSupport; +import org.nuiton.topia.TopiaHibernateSupport; import org.nuiton.topia.persistence.TopiaEntity; import org.nuiton.topia.persistence.TopiaQueryBuilderAddCriteriaOrRunQueryStep; @@ -417,7 +419,6 @@ addImport(daoAbstractClass, Set.class); } addImport(daoAbstractClass, List.class); - addImport(daoAbstractClass, TopiaException.class); addImport(daoAbstractClass, TopiaQueryBuilderAddCriteriaOrRunQueryStep.class); ObjectModelOperation op; @@ -495,6 +496,8 @@ PROP_DEFAULT_PACKAGE) + '.' + modelName + "DAOHelper.getImplementationClass"; + boolean hibernateSupportGenerated = false; + for (ObjectModelAttribute attr : clazz.getAttributes()) { String attrType = GeneratorUtil.getSimpleName(attr.getType()); @@ -559,16 +562,31 @@ // System.out.println("Query : " + query); // List<<%=attrType%>> list = dao.findAllByQuery(query); + if (!hibernateSupportGenerated) { + hibernateSupportGenerated = true; + addImport(result, TopiaHibernateSupport.class); + addImport(result, HibernateTopiaJpaSupport.class); + addImport(result, Session.class); + body.append("" +/*{ + TopiaHibernateSupport hibernateSupport = ((HibernateTopiaJpaSupport) topiaJpaSupport).getHibernateSupport(); + Session hibernateSession = hibernateSupport.getHibernateSession(); +}*/ + ); + } + String removeName = getJavaBeanMethodName("remove", reverseAttrName); body.append("" /*{ { - List<<%=attrType%>> list = topiaHibernateSupport.getHibernateSession().createSQLQuery( - "SELECT main.topiaid " + - "from <%=attrClassifierDBName%> main, <%=attrJoinTableName%> secondary " + - "where main.topiaid=secondary.<%=attrDBName%>" + - " and secondary.<%=attrReverseDBName%>='" + entity.getTopiaId() + "'") - .addEntity("main", <%=entityEnumName%>.<%=attrType%>.getImplementation()).list(); + String sql = "SELECT main.topiaid " + + " FROM <%=attrClassifierDBName%> main, <%=attrJoinTableName%> secondary " + + " WHERE main.topiaid=secondary.<%=attrDBName%> " + + " AND secondary.<%=attrReverseDBName%>='" + entity.getTopiaId() + "'"; + List<<%=attrType%>> list = hibernateSession + .createSQLQuery(sql) + .addEntity("main", <%=entityEnumName%>.<%=attrType%>.getImplementation()) + .list(); for (<%=attrType%> item : list) { item.<%=removeName%>(entity);
participants (1)
-
athimel@users.nuiton.org