我创建了一个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);
}
}