/**
* Abiquo community edition
* cloud management application for hybrid clouds
* Copyright (C) 2008-2010 - Abiquo Holdings S.L.
*
* This application 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 under
* version 3 of the License
*
* This software 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
* LESSER GENERAL PUBLIC LICENSE v.3 for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
/**
*
*/
package com.abiquo.abiserver.persistence.hibernate;
import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.criterion.Restrictions;
import com.abiquo.abiserver.exception.PersistenceException;
import com.abiquo.abiserver.persistence.DAO;
/**
* This class implements the Crudable interface with all the common methods implemented by
* {@link GenericHibernateDAO} but without session and transaction managing, that will be managed by
* the HibernateDAOfactory
*
* @author jdevesa@abiquo.com
*/
public class HibernateDAO<T, ID extends Serializable> implements DAO<T, ID>
{
/**
* Class to work with
*/
protected Class<T> persistentClass;
/**
* Hibernate session
*/
private Session session;
@SuppressWarnings("unchecked")
@Override
public List<T> findAll() throws PersistenceException
{
Criteria criteria = getSession().createCriteria(getPersistentClass());
return criteria.list();
}
@SuppressWarnings("unchecked")
@Override
public T findById(final ID id)
{
return (T) getSession().get(getPersistentClass(), id);
}
@SuppressWarnings("unchecked")
@Override
public List<T> findByNamedQuery(final String name)
{
Query query = getSession().getNamedQuery(name);
return query.list();
}
@SuppressWarnings("unchecked")
@Override
public List<T> findByNamedQuery(final String name, final Map<String, ? > params)
{
Query query = getSession().getNamedQuery(name);
if (params != null)
{
for (Map.Entry<String, ? > param : params.entrySet())
{
if (param.getValue() instanceof Collection)
{
query.setParameterList(param.getKey(), (Collection) param.getValue());
}
else
{
query.setParameter(param.getKey(), param.getValue());
}
}
}
return query.list();
}
@SuppressWarnings("unchecked")
@Override
public List<T> findByNamedQuery(final String name, final Object... params)
{
Query query = getSession().getNamedQuery(name);
if (params != null)
{
int i = 0;
for (Object param : params)
{
query.setParameter(i++, param);
}
}
return query.list();
}
@SuppressWarnings("unchecked")
@Override
public T findUniqueByNamedQuery(final String name)
{
Query query = getSession().getNamedQuery(name);
return (T) query.uniqueResult();
}
@SuppressWarnings("unchecked")
@Override
public T findUniqueByNamedQuery(final String name, final Map<String, ? > params)
{
Query query = getSession().getNamedQuery(name);
if (params != null)
{
for (Map.Entry<String, ? > param : params.entrySet())
{
if (param.getValue() instanceof Collection)
{
query.setParameterList(param.getKey(), (Collection) param.getValue());
}
else
{
query.setParameter(param.getKey(), param.getValue());
}
}
}
return (T) query.uniqueResult();
}
@SuppressWarnings("unchecked")
@Override
public List<T> findByProperty(final String property, final Object value)
{
Criteria c = getSession().createCriteria(persistentClass);
c.add(Restrictions.eq(property, value));
return c.list();
}
@SuppressWarnings("unchecked")
@Override
public T findUniqueByProperty(final String property, final Object value)
{
Criteria c = getSession().createCriteria(persistentClass);
c.add(Restrictions.eq(property, value));
return (T) c.uniqueResult();
}
@SuppressWarnings("unchecked")
@Override
public List<T> findByProperties(final String[] properties, final Object[] values)
{
Criteria c = getSession().createCriteria(persistentClass);
for (int i = 0; i < properties.length; i++)
{
c.add(Restrictions.eq(properties[i], values[i]));
}
return c.list();
}
@SuppressWarnings("unchecked")
@Override
public T findUniqueByProperties(final String[] properties, final Object[] values)
{
Criteria c = getSession().createCriteria(persistentClass);
for (int i = 0; i < properties.length; i++)
{
c.add(Restrictions.eq(properties[i], values[i]));
}
return (T) c.uniqueResult();
}
@Override
public T makePersistent(final T entity) throws PersistenceException
{
getSession().saveOrUpdate(entity);
return entity;
}
@Override
public T makePersistent(final String entityName, final T entity) throws PersistenceException
{
getSession().saveOrUpdate(entityName, entity);
return entity;
}
@Override
public void makeTransient(final T entity) throws PersistenceException
{
getSession().delete(entity);
}
@Override
public void makeTransient(final String entityName, final T entity) throws PersistenceException
{
getSession().delete(entityName, entity);
}
/**
* @return the persistentClass
*/
public Class<T> getPersistentClass()
{
return persistentClass;
}
/**
* @return the session
*/
public Session getSession()
{
return session;
}
/**
* @param persistentClass the persistentClass to set
*/
public void setPersistentClass(final Class<T> persistentClass)
{
this.persistentClass = persistentClass;
}
/**
* @param session the session to set
*/
public void setSession(final Session session)
{
this.session = session;
}
/**
* @see com.abiquo.abiserver.persistence.Crudable#merge(java.lang.Object)
* @see org.hibernate.Session#merge(Object)
*/
@Override
public T merge(final T entity) throws PersistenceException
{
return (T) getSession().merge(entity);
}
/**
* @see com.abiquo.abiserver.persistence.Crudable#merge(java.lang.String, java.lang.Object)
* @see org.hibernate.Session#merge(String, Object)
*/
@Override
public T merge(final String entityName, final T entity) throws PersistenceException
{
return (T) getSession().merge(entityName, entity);
}
/**
* @see com.abiquo.abiserver.persistence.Crudable#refresh(java.lang.Object)
* @see org.hibernate.Session#refresh(Object)
*/
@Override
public void refresh(final T entity) throws PersistenceException
{
getSession().refresh(entity);
}
}