/** * ============================================================================= * * ORCID (R) Open Source * http://orcid.org * * Copyright (c) 2012-2014 ORCID, Inc. * Licensed under an MIT-Style License (MIT) * http://orcid.org/open-source-license * * This copyright and license information (including a link to the full license) * shall be included in its entirety in all copies or substantial portion of * the software. * * ============================================================================= */ package org.orcid.persistence.dao.impl; import java.io.Serializable; import java.util.Date; import java.util.List; import javax.annotation.Resource; import javax.persistence.EntityManager; import javax.persistence.Query; import org.orcid.persistence.dao.GenericDao; import org.orcid.persistence.jpa.entities.OrcidEntity; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; /** * orcid-persistence - Dec 7, 2011 - GenericDaoImpl * * @author Will Simpson and Declan Newman */ public class GenericDaoImpl<E extends OrcidEntity<I>, I extends Serializable> implements GenericDao<E, I> { @Resource(name="entityManager") protected EntityManager entityManager; private Class<E> clazz; public void setEntityManager(EntityManager entityManager) { this.entityManager = entityManager; } public GenericDaoImpl(Class<E> clazz) { this.clazz = clazz; } @Override public E find(I id) { return entityManager.find(clazz, id); } @SuppressWarnings("unchecked") @Override public List<E> findLastModifiedBefore(Date latestDate, int maxResults) { Query query = entityManager.createQuery("from " + clazz.getSimpleName() + " where lastModified <= :latestDate"); query.setParameter("latestDate", latestDate); query.setMaxResults(maxResults); return query.getResultList(); } @SuppressWarnings("unchecked") @Override public List<E> getAll() { return entityManager.createQuery("from " + clazz.getSimpleName()).getResultList(); } @Override @Transactional(propagation = Propagation.REQUIRED) public void remove(E e) { entityManager.remove(e); } @Override @Transactional(propagation = Propagation.REQUIRED) public void remove(I id) { E e = find(id); entityManager.remove(e); } @Override @Transactional(propagation = Propagation.REQUIRED) public void removeAll() { entityManager.createQuery("delete from " + clazz.getSimpleName()).executeUpdate(); } @Override @Transactional(propagation = Propagation.REQUIRED) public void flush() { entityManager.flush(); } @Override public void flushWithoutTransactional() { entityManager.flush(); } @Override @Transactional(propagation = Propagation.REQUIRED) public void persist(E e) { entityManager.persist(e); } @Override @Transactional(propagation = Propagation.REQUIRED) public E merge(E e) { return entityManager.merge(e); } @Override @Transactional(propagation = Propagation.REQUIRED) public void detatch(E e) { entityManager.detach(e); } @Override public void refresh(E e) { entityManager.refresh(e); } @Override @Transactional(propagation = Propagation.REQUIRED) public Long countAll() { return (Long) entityManager.createQuery("select count(e) from " + clazz.getSimpleName() + " e").getSingleResult(); } }