Create BaseDAO for each Dao class

I created a spring app where I decided to add BaseDAO to eliminate redundant create, update, delete, findByid and findAll for each dao. So I created a baseDao and every dao should extend this BaseDAO.

BaseDaoImpl

public class BaseDAOImpl implements BaseDAO{

    SessionFactory sessionFactory;

    public void setSessionFactory(SessionFactory sf){
        this.sessionFactory = sf;
    }

    @Override
    public void create(ModelBase modelBase) {

         Session session = this.sessionFactory.getCurrentSession();
         session.persist(modelBase);
    }

    @Override
    public void update(ModelBase modelBase) {

        Session session = this.sessionFactory.getCurrentSession();
         session.update(modelBase);
    }

    @Override
    public Collection findAll(Class aClass) {

        Session session = this.sessionFactory.getCurrentSession();
        Collection  modelCols = session.createQuery("from "+aClass.getSimpleName()).list();
        return modelCols;
    }

    @Override
    public ModelBase findById(Class aClass, Integer id) {
        Session session = this.sessionFactory.getCurrentSession();     
        ModelBase modelBase = (ModelBase) session.load(aClass, new Integer(id));
        return modelBase;
    }



}

      

Then I expand this Dao to every DAO

EmployeeDAOImp

public class EmployeeDAOImpl extends BaseDAOImpl implements EmployeeDAO{

    private SessionFactory sessionFactory;

    public void setSessionFactory(SessionFactory sf){
        this.sessionFactory = sf;
    }
}

      

I created a BaseService like this. But when I try to access BaseDAO methods from EmployeeDAO, it returns null pointer exception. Why is this happening. I dont want to use genericDAO from google. Because we have to create a DAO for each model. I want to fix this. Therefore, I follow this method.

+3


source to share


4 answers


You are overriding setSessionFactory

from the base class for no reason, its already available with class extension EmployeeDAOImpl

, either remove it or try below:



public class EmployeeDAOImpl extends BaseDAOImpl implements EmployeeDAO{

   //this reference should be from base class,
   // the extending class ref is hiding base ref.
  //  private SessionFactory sessionFactory;

    public void setSessionFactory(SessionFactory sf){
      super.setSessionFactory(sf);
    }
}

      

0


source


Do you have a Spring Data project and Spring Data JPA in particular?

This will save you a lot of time as you no longer need to write your DAOs / Repositories from scratch, all you have to do is enable Spring Data JPA and add the required interfaces. This should save you tons of time.



+1


source


Something like the following should work (note the use of the constructor, not the installation setup). In BaseDAO:

public class BaseDAOImpl implements BaseDAO {

  private final SessionFactory sessionFactory;

  public BaseDAOImpl(SessionFactory sessionFactory) {
    this.sessionFactory = sessionFactory;
  }
}

      

Then in the Employee DAO:

public class EmployeeDAOImpl extends BaseDAOImpl implements EmployeeDAO {

  @Inject
  public EmployeeDAOImpl (SessionFactory sessionFactory) {
    super(sessionFactory);
  }
}

      

0


source


You can create a generic dao.

@Repository("genericDao")
public class GenericDaoImpl<T,PK extends Serializable> implements GenericDao<T, PK> {

    protected Class<T> entityClass;

    public T create(T t) {
       this.entityManager.persist(t);
       return t;
    }

    public T read(PK id,Class<T> c) {
       return (T)this.entityManager.find(c, id);
    }

    public T update(T t) {
       return this.entityManager.merge(t);
    }

    public void delete(T t) {
        t = this.entityManager.merge(t);
       this.entityManager.remove(t);
    }

    public List<T> getAll(Class<T> c){
        return this.entityManager.createQuery("SELECT o FROM "+ c.getName() +" o").getResultList();
    }
  }

      

UPDATED

You can use the following: TimeRange - pojo class in the following example. If you don't need a level of service. You can use timeRangeDao in your controller.

@Service("timeRangeService")
public class TimeRangeServiceImpl implements TimeRangeService{
    @Autowired
    GenericDao<TimeRange,Long> timeRangeDao;

    public List<TimeRange> getAllTimeRanges(){
            return timeRangeDao.getAll(TimeRange.class);
    }

    @Transactional
    public void createTimeRange(TimeRange c) {
            timeRangeDao.create(c);
    }

    @Transactional
    public void update(TimeRange p) {
            timeRangeDao.update(p);
    }

    @Transactional
    public TimeRange getTimeRange(long id) {
            return timeRangeDao.read(id, TimeRange.class);
    }

    @Transactional
    public void delete(long id) {
            TimeRange timeRange = new TimeRange();
            timeRange.setId(id);
            timeRangeDao.delete(timeRange);
    }

 }

      

0


source







All Articles