package net.techreadiness.persistence.dao; import java.lang.reflect.ParameterizedType; import java.util.ArrayList; import java.util.List; import javax.inject.Inject; import javax.persistence.EntityManager; import javax.persistence.NoResultException; import javax.persistence.PersistenceContext; import javax.persistence.Query; import javax.persistence.TypedQuery; import net.techreadiness.service.ServiceContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Repository; @Repository public abstract class BaseDAOImpl<T> implements BaseDAO<T> { private final Logger log = LoggerFactory.getLogger(BaseDAOImpl.class); private Class<T> domainClass; @Inject private ServiceContext serviceContext; @PersistenceContext protected EntityManager em; public void setEntityManager(EntityManager em) { this.em = em; } @SuppressWarnings("unchecked") public BaseDAOImpl() { ParameterizedType type = (ParameterizedType) getClass().getGenericSuperclass(); this.domainClass = (Class<T>) type.getActualTypeArguments()[0]; } @Override public T create(T t) { return em.merge(t); } @Override public void persist(T t) { if (t == null) { return; } em.persist(t); } @Override public void delete(T t) { log.debug("Delete: {}; serviceContext={}", domainClass, serviceContext); if (t == null) { return; } // We need to provide the user name to the audit history. if (serviceContext != null && serviceContext.getUserName() != null) { Query q = em.createNativeQuery("select set_audit_delete_info(:username) from dual;"); q.setParameter("username", serviceContext.getUserName()); } em.remove(em.merge(t)); } @Override public List<T> findAll() { List<T> entities = new ArrayList<>(); try { String s = "select c from " + domainClass.getName() + " c"; if (getOrderBy() != null) { s += " order by " + getOrderBy(); } entities = em.createQuery(s, domainClass).getResultList(); } catch (Exception e) { e.printStackTrace(); } return entities; } @Override public T getById(Long id) { if (id == null) { return null; } return em.find(domainClass, id); } @Override public T update(T t) { return em.merge(t); } public String getOrderBy() { return null; } protected <X> X getSingleResult(TypedQuery<X> query) { try { return query.getSingleResult(); } catch (NoResultException e) { return null; } } protected List<T> getResultList(TypedQuery<T> query) { try { return query.getResultList(); } catch (NoResultException e) { return null; } } protected Object getSingleResult(Query query) { try { return query.getSingleResult(); } catch (NoResultException e) { return null; } } protected TypedQuery<T> getNamedQuery(String queryName) { return em.createNamedQuery(queryName, domainClass); } }