/** * Copyright (C) 2008-2010, Squale Project - http://www.squale.org * * This file is part of Squale. * * Squale is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation, either version 3 of the * License, or any later version. * * Squale is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with Squale. If not, see <http://www.gnu.org/licenses/>. */ /* * Cree le 31 janv. 05 */ package org.squale.jraf.provider.persistence.hibernate; import java.io.Serializable; import java.util.Collection; import java.util.Iterator; import java.util.List; import org.hibernate.Criteria; import org.hibernate.HibernateException; import org.hibernate.ObjectNotFoundException; import org.hibernate.Query; import org.hibernate.criterion.Example; import org.hibernate.criterion.MatchMode; import org.hibernate.proxy.HibernateProxy; import org.hibernate.type.Type; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.squale.jraf.commons.exception.JrafConfigException; import org.squale.jraf.commons.exception.JrafDaoException; import org.squale.jraf.helper.PersistenceHelper; import org.squale.jraf.spi.initializer.IInitializableBean; import org.squale.jraf.spi.persistence.IMetaData; import org.squale.jraf.spi.persistence.IPersistenceProvider; import org.squale.jraf.spi.persistence.ISession; import org.squale.jraf.spi.persistence.ITLSHibernateDAO; /** * <p>Project: JRAF * <p>Title : AbstractTLSHibernateDAO</p> * <p>Description : </p> * <p>Copyright : Copyright (c) 2005</p> * */ public abstract class AbstractTLSHibernateDAO extends AbstractDAOImpl implements ITLSHibernateDAO, IInitializableBean { /** logger */ private final static Log log = LogFactory.getLog(AbstractTLSHibernateDAO.class); /** classe du bo lie */ private Class businessClass = null; /** provider de persistance */ private IPersistenceProvider persistenceProvider; /** alias du au bo lie */ private String alias = null; /** * variable contenant le d�but d'une requete. * ex: pour une classe Foo nous aurons <b>from Foo as foo</b> */ private String requete = null; /** * Constructeur avec parametres type IOC3 * @param businessClass bo associe * @param persistenceProvider provider de persistance */ public AbstractTLSHibernateDAO( Class clazz, IPersistenceProvider provider) { setBusinessClass(clazz); setPersistenceProvider(provider); afterPropertiesSet(); } /** * Constructeur avec parametres type IOC3 * @param businessClass bo associe */ public AbstractTLSHibernateDAO(Class clazz) { this(clazz, null); } /** * Constructeur vide type IOC2 */ public AbstractTLSHibernateDAO() { } /* (non-Javadoc) * @see org.squale.jraf.provider.persistence.hibernate.tls.spi.IPersistenceDAOTLS#count() */ public Integer count() throws JrafDaoException { return count(getPersistenceProvider().getSession()); } /* (non-Javadoc) * @see org.squale.jraf.provider.persistence.hibernate.tls.spi.IPersistenceDAOTLS#countWhere(java.lang.String) */ public Integer countWhere(String whereClause) throws JrafDaoException { return countWhere(getPersistenceProvider().getSession(), whereClause); } /* (non-Javadoc) * @see org.squale.jraf.spi.persistence.ITLSHibernateDAO#countWhere(java.lang.String, java.lang.Object) */ public Integer countWhere(String whereClause, Object bean) throws JrafDaoException { return countWhere( getPersistenceProvider().getSession(), whereClause, bean); } /** * Retourne le nombre d'objets en fonction de la clause where * Si la clause where existe, elle doit comporter une clause where valide incluant * le mot cl� <b>Where</b * <li> ie: 'where Avion = ?'</li> * Sinon, elle peut �tre nulle dans ce cas il s'agit d'un <b>select *</b> * @param whereClause * @param values Tableau des valeurs des parametres de la requete * @param types Tableau des types hibernate des parametres de la requete (ex Hibernate.STRING) * @return Integer Nombre d'�l�ment trouv�. * @throws JrafDaoException */ public Integer countWhere( String whereClause, Object[] values, Type[] types) throws JrafDaoException { return countWhere( getPersistenceProvider().getSession(), whereClause, values, types); } /* (non-Javadoc) * @see org.squale.jraf.provider.persistence.hibernate.tls.spi.IPersistenceDAOTLS#create(java.lang.Object) */ public void create(Object objMetier) throws JrafDaoException { create(getPersistenceProvider().getSession(), objMetier); } /* (non-Javadoc) * @see org.squale.jraf.provider.persistence.hibernate.tls.spi.IPersistenceDAOTLS#find(java.lang.String) */ public List find(String req) throws JrafDaoException { return find(getPersistenceProvider().getSession(), req); } /* (non-Javadoc) * @see org.squale.jraf.provider.persistence.hibernate.tls.spi.IPersistenceDAOTLS#findAll() */ public List findAll() throws JrafDaoException { return findAll(getPersistenceProvider().getSession()); } /* (non-Javadoc) * @see org.squale.jraf.provider.persistence.hibernate.tls.spi.IPersistenceDAOTLS#findByExample(java.lang.Object, boolean, boolean) */ public List findByExample(Object bo, boolean ignoreCase, boolean likeMode) throws JrafDaoException { return findByExample(bo, -1, -1, ignoreCase, likeMode); } /* (non-Javadoc) * @see org.squale.jraf.provider.persistence.hibernate.tls.spi.IPersistenceDAOTLS#findByExample(java.lang.Object, int, int, boolean, boolean) */ public List findByExample( Object bo, int nbLignes, int indexDepart, boolean ignoreCase, boolean likeMode) throws JrafDaoException { return findByExample( bo, nbLignes, indexDepart, ignoreCase, likeMode, false); } /* (non-Javadoc) * @see org.squale.jraf.provider.persistence.hibernate.tls.spi.IPersistenceDAOTLS#findByExample(java.lang.Object, int, int) */ public List findByExample(Object bo, int nbLignes, int indexDepart) throws JrafDaoException { return findByExample(bo, nbLignes, indexDepart, false, false); } /* (non-Javadoc) * @see org.squale.jraf.provider.persistence.hibernate.tls.spi.IPersistenceDAOTLS#findByExample(java.lang.Object) */ public List findByExample(Object bo) throws JrafDaoException { return findByExample(bo, -1, -1, false, false); } /* (non-Javadoc) * @see org.squale.jraf.provider.persistence.hibernate.tls.spi.IPersistenceDAOTLS#findWhere(java.lang.String) */ public List findWhere(String whereClause) throws JrafDaoException { return findWhere(getPersistenceProvider().getSession(), whereClause); } /** * Retourne une liste d'objet fonction de la clause where. * @param whereClause: clause avec le mot clef "where" en premier * @param values Tableau des valeurs des parametres de la requete * @param types Tableau des types des parametres de la requete * @return List * @throws JrafDaoException */ public java.util.List findWhere( String whereClause, Object[] values, Type[] types) throws JrafDaoException { return findWhere( getPersistenceProvider().getSession(), whereClause, values, types); } /* (non-Javadoc) * @see org.squale.jraf.spi.persistence.ITLSHibernateDAO#findWhere(java.lang.String, java.lang.Object) */ public java.util.List findWhere(String whereClause, Object bean) throws JrafDaoException { return findWhere( getPersistenceProvider().getSession(), whereClause, bean); } /* (non-Javadoc) * @see org.squale.jraf.provider.persistence.hibernate.tls.spi.IPersistenceDAOTLS#findWhereScrollable(java.lang.String, int, int, boolean) */ public Object findWhereScrollable( String whereClause, int nbLignes, int indexDepart, boolean bCaching) throws JrafDaoException { return findWhereScrollable( getPersistenceProvider().getSession(), whereClause, nbLignes, indexDepart, bCaching); } /** * Method findWhereScrollable. Retourne nbligne de la requete pass�e en argument * Si la clause where existe, elle doit comporter une clause where valide incluant * le mot cl� <b>Where</b * <li> ie: 'where Avion = ?'</li> * Sinon, elle peut �tre nulle dans ce cas il s'agit d'un select * * @param whereClause Requete a executer * @param values Tableau des valeurs des parametres de la requete * @param types Tableau des types des parametres de la requete * @param nbLignes Nombre de lignes a retourner * @param indexDepart Index de lma premiere ligne a retourner * @param bCaching Si <b>true</b> retourne utilise l'API iterate() sinon list() * @return Object soit une List si bcaching = true. * soit un Iterator si bcaching = false. * @throws JrafDaoException */ public Object findWhereScrollable( String whereClause, Object[] values, Type[] types, int nbLignes, int indexDepart, boolean bCaching) throws JrafDaoException { return findWhereScrollable( getPersistenceProvider().getSession(), whereClause, values, types, nbLignes, indexDepart, bCaching); } /* (non-Javadoc) * @see org.squale.jraf.spi.persistence.ITLSHibernateDAO#findWhereScrollable(java.lang.String, java.lang.Object, int, int, boolean) */ public Object findWhereScrollable( String whereClause, Object bean, int nbLignes, int indexDepart, boolean bCaching) throws JrafDaoException { return findWhereScrollable( getPersistenceProvider().getSession(), whereClause, bean, nbLignes, indexDepart, bCaching); } /* (non-Javadoc) * @see org.squale.jraf.provider.persistence.hibernate.tls.spi.IPersistenceDAOTLS#get(java.io.Serializable) */ public Object get(Serializable id) throws JrafDaoException { ISession session = getPersistenceProvider().getSession(); return get(session, id); } /** * Impl�mentation sp�cifique Hibernate<br> * Retourne un iterator sur le r�sultat d'une clause OQL. L'usage de cette m�thode * permet de ne pas forcer la lecture compl�tes des objets. Par ailleurs les objets * sans proxy sont mis dans le cache de la session. * <br><br> * La clause where doit comporter une clause where valide incluant le mot cl� <b>Where</b * <li> ie: 'where Avion = a'</li> * <br><br> * <b>Rappel</b><br> * Si vous utilisez un proxy, aucun objet n'est instanci� r�ellement la mise en cache aura lieu uniquement * pour les objets qui seront r�ellement concr�tis�s. * <br> * @param sessionHibernate * @param whereClause * @return Iterator * @throws JrafDaoException */ public Iterator iterate(String whereClause) throws JrafDaoException { return iterate(getPersistenceProvider().getSession(), whereClause); } /** * Impl�mentation sp�cifique Hibernate<br> * Retourne un iterator sur le r�sultat d'une clause OQL. L'usage de cette m�thode * permet de ne pas forcer la lecture compl�tes des objets. Par ailleurs les objets * sans proxy sont mis dans le cache de la session. * <br><br> * La clause where doit comporter une clause where valide incluant le mot cl� <b>Where</b * <li> ie: 'where Avion = ?'</li> * <br><br> * <b>Rappel</b><br> * Si vous utilisez un proxy, aucun objet n'est instanci� r�ellement la mise en cache aura lieu uniquement * pour les objets qui seront r�ellement concr�tis�s. * <br> * @param whereClause * @param values Tableau des valeurs des parametres de la requete * @param types Tableau des types des parametres de la requete * @return Iterator * @throws JrafDaoException */ public Iterator iterate(String whereClause, Object[] values, Type[] types) throws JrafDaoException { return iterate( getPersistenceProvider().getSession(), whereClause, values, types); } /** * Impl�mentation sp�cifique Hibernate<br> * Retourne un iterator sur le r�sultat d'une clause OQL. L'usage de cette m�thode * permet de ne pas forcer la lecture compl�tes des objets. Par ailleurs les objets * sans proxy sont mis dans le cache de la session. * <br><br> * La clause where doit comporter une clause where valide incluant le mot cl� <b>Where</b * <li> ie: 'where Avion = :avion'</li> * <br><br> * <b>Rappel</b><br> * Si vous utilisez un proxy, aucun objet n'est instanci� r�ellement la mise en cache aura lieu uniquement * pour les objets qui seront r�ellement concr�tis�s. * <br> * @param whereClause * @param bean Bean ou sont lu les parametres de la requete * @return Iterator * @throws JrafDaoException */ public Iterator iterate(String whereClause, Object bean) throws JrafDaoException { return iterate( getPersistenceProvider().getSession(), whereClause, bean); } /* (non-Javadoc) * @see org.squale.jraf.provider.persistence.hibernate.tls.spi.IPersistenceDAOTLS#load(java.io.Serializable) */ public Object load(Serializable oid) throws JrafDaoException { Object obj = load(getPersistenceProvider().getSession(), oid); return obj; } /* (non-Javadoc) * @see org.squale.jraf.provider.persistence.hibernate.tls.spi.IPersistenceDAOTLS#loadFromSession(java.io.Serializable) */ public Object loadFromSession(Serializable oid) throws JrafDaoException { Object loaded = loadFromSession(getPersistenceProvider().getSession(), oid); return loaded; } /* (non-Javadoc) * @see org.squale.jraf.provider.persistence.hibernate.tls.spi.IPersistenceDAOTLS#refresh(java.lang.Object) */ public void refresh(Object obj) throws JrafDaoException { refresh(getPersistenceProvider().getSession(), obj); } /* (non-Javadoc) * @see org.squale.jraf.provider.persistence.hibernate.tls.spi.IPersistenceDAOTLS#remove(java.lang.Object) */ public void remove(Object objMetier) throws JrafDaoException { remove(getPersistenceProvider().getSession(), objMetier); } /* (non-Javadoc) * @see org.squale.jraf.provider.persistence.hibernate.tls.spi.IPersistenceDAOTLS#removeAll() */ public void removeAll() throws JrafDaoException { removeAll(getPersistenceProvider().getSession()); } /* (non-Javadoc) * @see org.squale.jraf.provider.persistence.hibernate.tls.spi.IPersistenceDAOTLS#removeWhere(java.lang.String) */ public int removeWhere(String whereClause) throws JrafDaoException { return removeWhere(getPersistenceProvider().getSession(), whereClause); } /** * Impl�mentation sp�cifique Hibernate<br> * Supression d'un sous ensemble selectionn� suivant une requete HQL. * Si la clause where existe, elle doit comporter une clause where valide incluant * le mot cl� <b>Where</b * <li> ie: 'where Avion = ?'</li> * Sinon, elle peut �tre nulle dans ce cas il s'agit d'un select * * @param session * @param whereClause clause where de la requete HQL. * @param values Tableau des valeurs des parametres de la requete * @param types Tableau des types des parametres de la requete * @return nombre d'instance supprime * @throws JrafDaoException */ public int removeWhere(String whereClause, Object[] values, Type[] types) throws JrafDaoException { return removeWhere( getPersistenceProvider().getSession(), whereClause, values, types); } /* (non-Javadoc) * @see org.squale.jraf.spi.persistence.ITLSHibernateDAO#removeWhere(java.lang.String, java.lang.Object) */ public int removeWhere(String whereClause, Object bean) throws JrafDaoException { return removeWhere( getPersistenceProvider().getSession(), whereClause, bean); } /* (non-Javadoc) * @see org.squale.jraf.provider.persistence.hibernate.tls.spi.IPersistenceDAOTLS#save(java.lang.Object) */ public void save(Object objMetier) throws JrafDaoException { save(getPersistenceProvider().getSession(), objMetier); } /* (non-Javadoc) * @see org.squale.jraf.spi.initializer.IInitializableBean#afterPropertiesSet() */ public void afterPropertiesSet() { if (getBusinessClass() == null) { throw new JrafConfigException("Le bo lie ne peut etre null"); } if (getPersistenceProvider() == null) { setPersistenceProvider(PersistenceHelper.getPersistenceProvider()); } // on fixe l'alias setAlias(getClassName(getBusinessClass()).toLowerCase()); // on fixe la requete setRequete( "from " + getClassName(getBusinessClass()) + " as " + getAlias() + " "); } /** * Retourne la classe du bo lie * @return classe du bo lie */ public Class getBusinessClass() { return businessClass; } /** * Retourne le provider de persistance * @return provider de persistance */ public IPersistenceProvider getPersistenceProvider() { return persistenceProvider; } /** * Fixe le bo lie * @param class1 bo lie */ public void setBusinessClass(Class class1) { businessClass = class1; } /** * Fixe le provider de persistance * @param provider provider de persistance */ public void setPersistenceProvider(IPersistenceProvider provider) { persistenceProvider = provider; } /** * Retourne l'alias * @return alias */ protected String getAlias() { return alias; } /** * Fixe la requete * @return requete */ public String getRequete() { return requete; } /** * Fixe l'alias * @param string alias */ protected void setAlias(String string) { alias = string; } /** * Fixe la requete * @param string requete */ protected void setRequete(String string) { requete = string; } /** * Retourne le nom court de la classe * @param class1 objet class * @return nom court de la classe */ private static String getClassName(Class class1) { int index = class1.getName().lastIndexOf("."); return (class1.getName().substring(index + 1)); } /** * G�n�rer une exception de niveau DAO * @param e * @param methodName * @throws JrafDaoException */ protected void throwDAOException(Exception e, String methodName) throws JrafDaoException { log.error("Erreur AbstractDAOImpl methode :" + methodName, e); throw new JrafDaoException( "Erreur AbstractDAOImpl methode :" + methodName, e); } /** * Retourne les meta donnees de persistance * @return meta donnees de persistance */ protected IMetaData getMetaData() { return getPersistenceProvider().getMetaData(); } /* (non-Javadoc) * @see org.squale.jraf.spi.persistence.ITLSHibernateDAO#findByExample(java.lang.Object, int, int, boolean, boolean, boolean) */ public List findByExample( Object bo, int nbLignes, int indexDepart, boolean ignoreCase, boolean likeMode, boolean cache) throws JrafDaoException { List l = findByExample( getPersistenceProvider().getSession(), bo, nbLignes, indexDepart, ignoreCase, likeMode, cache); return l; } /* (non-Javadoc) * @see org.squale.jraf.spi.persistence.ITLSHibernateDAO#findByExample(java.lang.Object, int, int, boolean) */ public List findByExample( Object bo, int nbLignes, int indexDepart, boolean cache) throws JrafDaoException { return findByExample(bo, nbLignes, indexDepart, false, false, cache); } /* (non-Javadoc) * @see org.squale.jraf.spi.persistence.ITLSHibernateDAO#findWhereScrollable(java.lang.String, int, int) */ public List findWhereScrollable( String whereClause, int nbLignes, int indexDepart) throws JrafDaoException { return (List) findWhereScrollable( whereClause, nbLignes, indexDepart, false); } }