javajpacruddaogenericdao

Single DAO & generic CRUD methods (JPA/Hibernate + Spring)


Following my previous question, DAO and Service layers (JPA/Hibernate + Spring), I decided to use just a single DAO for my data layer (at least at the beginning) in an application using JPA/Hibernate, Spring and Wicket. The use of generic CRUD methods was proposed, but I'm not very sure how to implement this using JPA. Could you please give me an example or share a link regarding this?


Solution

  • Here is an example interface:

    public interface GenericDao<T, PK extends Serializable> {
        T create(T t);
        T read(PK id);
        T update(T t);
        void delete(T t);
    }
    

    And an implementation:

    public class GenericDaoJpaImpl<T, PK extends Serializable> 
        implements GenericDao<T, PK> {
    
        protected Class<T> entityClass;
    
        @PersistenceContext
        protected EntityManager entityManager;
    
        public GenericDaoJpaImpl() {
            ParameterizedType genericSuperclass = (ParameterizedType) getClass()
                 .getGenericSuperclass();
            this.entityClass = (Class<T>) genericSuperclass
                 .getActualTypeArguments()[0];
        }
    
        @Override
        public T create(T t) {
            this.entityManager.persist(t);
            return t;
        }
    
        @Override
        public T read(PK id) {
            return this.entityManager.find(entityClass, id);
        }
    
        @Override
        public T update(T t) {
            return this.entityManager.merge(t);
        }
    
        @Override
        public void delete(T t) {
            t = this.entityManager.merge(t);
            this.entityManager.remove(t);
        }
    }