我创建了一个Spring应用程序,在那里我决定添加BaseDAO以消除多余的创建,
更新,删除,findByid和find所有方法用于每个dao。所以我创建了一个baseDao,每个dao都应该扩展此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;
    }



}

然后我将此道扩展到每个DAO

员工DAOImp
public class EmployeeDAOImpl extends BaseDAOImpl implements EmployeeDAO{

    private SessionFactory sessionFactory;

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

我创建了这样的BaseService。但是,当我尝试从EmployeeDAO访问BaseDAO方法时,它将返回空指针异常。
为什么会这样。我不想使用谷歌的genericDAO。因为我们应该创建DAO
对于每个模型。我想消除这一点。所以我遵循这种方法。

最佳答案

您无缘无故地从基类覆盖setSessionFactory,扩展类EmployeeDAOImpl已经提供了它,请删除它或尝试以下操作:

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);
    }
}

10-02 23:37