package com.dominikdorn.lyrix.dao; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.persistence.PersistenceException; import javax.persistence.Query; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Root; import java.lang.reflect.ParameterizedType; import java.util.List; /** * Dominik Dorn * 0626165 * dominik.dorn@tuwien.ac.at */ public abstract class AbstractJpaGenericDaoImpl implements GenericDao { @PersistenceContext(unitName = "lyrixPU") protected EntityManager em; protected Class entityClass; protected AbstractJpaGenericDaoImpl() { ParameterizedType genericSuperclass = (ParameterizedType) getClass().getGenericSuperclass(); this.entityClass = (Class) genericSuperclass.getActualTypeArguments()[0]; } @Override public TYPE create(TYPE object) { if(object == null) throw new PersistenceException("given object may not be null"); em.persist(object); object = em.merge(object); return object; } @Override public TYPE edit(TYPE object) { if(object == null) throw new PersistenceException("given object may not be null"); em.merge(object); return object; } @Override public void remove(TYPE object) { if(object == null) throw new PersistenceException("given object may not be null"); em.refresh(object); em.remove(em.merge(object)); } @Override public TYPE find(KEY id) { if(id == null) throw new PersistenceException("given object may not be null"); return (TYPE) em.find(entityClass, id); } @Override public List findAll() { CriteriaQuery cq = em.getCriteriaBuilder().createQuery(); cq.select(cq.from(entityClass)); return em.createQuery(cq).getResultList(); } @Override public List findRange(int[] range) { CriteriaQuery cq = em.getCriteriaBuilder().createQuery(); cq.select(cq.from(entityClass)); Query q = em.createQuery(cq); q.setMaxResults(range[1] - range[0]); q.setFirstResult(range[0]); return q.getResultList(); } @Override public int count() { CriteriaQuery cq = em.getCriteriaBuilder().createQuery(); Root rt = cq.from(entityClass); cq.select(em.getCriteriaBuilder().count(rt)); Query q = em.createQuery(cq); return ((Long) q.getSingleResult()).intValue(); } public EntityManager getEm() { return em; } public void setEm(EntityManager em) { this.em = em; } public Class getEntityClass() { return entityClass; } public void setEntityClass(Class entityClass) { this.entityClass = entityClass; } }