package com.fp.armas.portal.dao.general; import java.io.Serializable; import java.lang.reflect.ParameterizedType; import javax.persistence.EntityExistsException; import javax.persistence.EntityManager; import javax.persistence.EntityNotFoundException; import javax.persistence.LockTimeoutException; import javax.persistence.NoResultException; import javax.persistence.NonUniqueResultException; import javax.persistence.OptimisticLockException; import javax.persistence.PersistenceContext; import javax.persistence.PersistenceException; import javax.persistence.PessimisticLockException; import javax.persistence.QueryTimeoutException; import javax.persistence.RollbackException; import javax.persistence.TransactionRequiredException; import com.fp.armas.portal.dao.exceptions.DaoException; import com.fp.armas.portal.util.PortalMessages; import com.fp.armas.portal.util.RegistroException; import com.fp.armas.portal.util.qualifier.DefaultDao; /** * Implementación del DAO genérico * @author dcruz * * @param */ @DefaultDao public class GenericDaoImpl implements GenericDao{ /** * Contexto de persistencia asociado a la base */ @PersistenceContext(unitName="portalPU") private EntityManager entityManager; private Class idClass; @SuppressWarnings("unchecked") public GenericDaoImpl(Class idClass) { this.idClass = idClass; } @Override public void create(T entity) throws DaoException { // TODO Auto-generated method stub try{ this.getEntityManager().clear(); this.getEntityManager().persist(entity); this.getEntityManager().flush(); } catch(PersistenceException e){ throw transformDaoException(e); } catch (Throwable e) { throw new DaoException(e); } } @Override public void update(T entity) throws DaoException { // TODO Auto-generated method stub try { this.getEntityManager().clear(); this.getEntityManager().merge(entity); this.getEntityManager().flush(); } catch(PersistenceException e){ throw transformDaoException(e); } catch (Throwable e) { throw new DaoException(e); } } @Override public void delete(T entity) throws DaoException { // TODO Auto-generated method stub try{ this.getEntityManager().clear(); this.getEntityManager().remove(this.getEntityManager().contains(entity) ? entity : this.getEntityManager().merge(entity)); this.getEntityManager().flush(); } catch(PersistenceException e){ throw transformDaoException(e); } catch (Throwable e) { throw new DaoException(e); } } @Override public T buscarPorId(Serializable id) throws RegistroException { try { return this.getEntityManager().find(idClass, id); } catch (PersistenceException e) { throw transformDaoException(e); } catch (Throwable e) { throw new DaoException(e); } } @Override public void detach(T entity) throws RegistroException { try { this.getEntityManager().detach(entity); } catch (PersistenceException e) { throw transformDaoException(e); } catch (Throwable e) { throw new DaoException(e); } } @Override public void refresh(T entity) throws RegistroException { try { this.getEntityManager().refresh(entity); } catch (PersistenceException e) { throw transformDaoException(e); } catch (Throwable e) { throw new DaoException(e); } } public EntityManager getEntityManager() { return entityManager; } private DaoException transformDaoException(PersistenceException e){ if(e instanceof EntityExistsException){ return new DaoException(PortalMessages.getInstancia().getString("error.jpa.entity.exists"), e); }else if(e instanceof EntityNotFoundException){ return new DaoException(PortalMessages.getInstancia().getString("error.jpa.entity.notfound"), e); }else if(e instanceof LockTimeoutException){ return new DaoException(PortalMessages.getInstancia().getString("error.jpa.lock.timeout"), e); }else if(e instanceof NonUniqueResultException){ return new DaoException(PortalMessages.getInstancia().getString("error.jpa.entity.nonuniqueresult"), e); }else if(e instanceof NoResultException){ return new DaoException(PortalMessages.getInstancia().getString("error.jpa.entity.noresult"), e); }else if(e instanceof OptimisticLockException){ return new DaoException(PortalMessages.getInstancia().getString("error.jpa.lock.optimisticlock"), e); }else if(e instanceof PessimisticLockException){ return new DaoException(PortalMessages.getInstancia().getString("error.jpa.lock.optimisticlock"), e); }else if(e instanceof QueryTimeoutException){ return new DaoException(PortalMessages.getInstancia().getString("error.jpa.entity.querytimeout"), e); }else if(e instanceof RollbackException){ return new DaoException(PortalMessages.getInstancia().getString("error.jpa.transaction.rollback"), e); }else if(e instanceof TransactionRequiredException){ return new DaoException(PortalMessages.getInstancia().getString("error.jpa.transaction.requiredtransaction"), e); } return new DaoException(e); } }