package util.dao;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.apache.log4j.Logger;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import util.HibernateUtil;
import dao.Daoable;
import dao.DataAccessException;
import entity.Persistable;
public class GenericDaoHibernate<T extends Persistable> implements Daoable<T> {
protected Logger logger = Logger.getLogger(GenericDaoHibernate.class);
protected Class<T> pojoClass;
protected GenericDaoHibernate(Class<T> pojoClass) {
this.pojoClass = pojoClass;
}
@Override
public List<T> getAll() throws DataAccessException{
List<T> entities = null;
Session session = HibernateUtil.getSession();
try {
logger.info("Fetching all instances of "
+ this.pojoClass.getCanonicalName());
session.beginTransaction();
Query query = session.createQuery("from "
+ this.pojoClass.getName());
entities = query.list();
if (entities == null) {
entities = Collections.emptyList();
}
logger.debug("A total of " + entities.size() + " fetched");
session.getTransaction().commit();
} catch (HibernateException e) {
session.getTransaction().rollback();
logger.error("Error while fetching all entities of class "
+ this.pojoClass.getCanonicalName(), e);
throw new DataAccessException("Error while fetching entities", e);
}
return entities;
}
@Override
public T find(long id) throws DataAccessException {
T entity = null;
Session session = HibernateUtil.getSession();
try {
logger.info("Fething " + this.pojoClass + " instance with id "
+ id);
session.beginTransaction();
entity = ((T) session.get(this.pojoClass, id));
session.getTransaction().commit();
} catch (HibernateException e) {
session.getTransaction().rollback();
logger.error("Error while searching entity of type "
+ this.pojoClass.getCanonicalName() + "by primary key", e);
throw new DataAccessException(
"Error while searching by primary key", e);
}
return entity;
}
@Override
public void save(T entity) throws DataAccessException {
Session session = HibernateUtil.getSession();
try {
logger.info("Saving " + this.pojoClass.getCanonicalName()
+ " instance");
session.beginTransaction();
session.saveOrUpdate(entity);
session.getTransaction().commit();
} catch (HibernateException e) {
session.getTransaction().rollback();
logger.error(
"Error while saving entity of class "
+ this.pojoClass.getCanonicalName(), e);
throw new DataAccessException("Error while saving entity", e);
}
}
@Override
public void delete(T entity) throws DataAccessException {
Session session = HibernateUtil.getSession();
try {
logger.info("Deleting " + this.pojoClass.getCanonicalName()
+ " instance");
session.beginTransaction();
session.delete(entity);
session.getTransaction().commit();
} catch (HibernateException e) {
session.getTransaction().rollback();
logger.error("Error while deleting entity of class "
+ this.pojoClass.getCanonicalName(), e);
throw new DataAccessException("Error while deleting entity", e);
}
}
protected Set<T> findByCallback(DaoCallBackVisitor visitor) throws DataAccessException {
List<T> entities = null;
Session session = HibernateUtil.getSession();
try {
logger.info("Fetching instances of "
+ this.pojoClass.getCanonicalName());
session.beginTransaction();
entities = visitor.visit(session).list();
if (entities == null) {
entities = Collections.emptyList();
}
logger.debug("A total of " + entities.size() + " fetched");
session.getTransaction().commit();
} catch (HibernateException e) {
session.getTransaction().rollback();
logger.error("Error while fetching entities of class "
+ this.pojoClass.getCanonicalName(), e);
throw new DataAccessException("Error while fetching entities", e);
}
return new HashSet<T>(entities);
}
}