package net.dontdrinkandroot.example.angularrestspringsecurity.dao; import net.dontdrinkandroot.example.angularrestspringsecurity.entity.Entity; import org.springframework.transaction.annotation.Transactional; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import javax.persistence.TypedQuery; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import java.util.List; /** * @param <T> Type of the Entity. * @param <I> Type of the Primary Key. * @author Philip Washington Sorst <philip@sorst.net> */ public class JpaDao<T extends Entity, I> implements Dao<T, I> { private EntityManager entityManager; protected Class<T> entityClass; public JpaDao(Class<T> entityClass) { this.entityClass = entityClass; } public EntityManager getEntityManager() { return this.entityManager; } @PersistenceContext public void setEntityManager(final EntityManager entityManager) { this.entityManager = entityManager; } @Override @Transactional(readOnly = true) public List<T> findAll() { final CriteriaBuilder builder = this.getEntityManager().getCriteriaBuilder(); final CriteriaQuery<T> criteriaQuery = builder.createQuery(this.entityClass); criteriaQuery.from(this.entityClass); TypedQuery<T> typedQuery = this.getEntityManager().createQuery(criteriaQuery); return typedQuery.getResultList(); } @Override @Transactional(readOnly = true) public T find(I id) { return this.getEntityManager().find(this.entityClass, id); } @Override @Transactional public T save(T entity) { return this.getEntityManager().merge(entity); } @Override @Transactional public void delete(I id) { if (id == null) { return; } T entity = this.find(id); if (entity == null) { return; } this.getEntityManager().remove(entity); } @Override @Transactional public void delete(T entity) { this.getEntityManager().remove(entity); } }