Action的excute方法: public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
PersonManager personManager = (PersonManager) ctx.getBean("personManager");
String userName = request.getParameter("user");
String password = request.getParameter("password");
Person person = personManager.login(userName, password);
if(person == null){
return mapping.findForward("fail");
}else if(person instanceof UserBean){
UserBean user = (UserBean) person;
request.getSession().setAttribute("person", user);
return mapping.findForward("successUser");
}else if(person instanceof AdminBean){
AdminBean admin = (AdminBean) person;
request.getSession().setAttribute("person", admin);
return mapping.findForward("successAdmin");
}else if(person instanceof SuperAdminBean){
SuperAdminBean superAdmin = (SuperAdminBean) person;
request.getSession().setAttribute("person", superAdmin);
return mapping.findForward("successSuperAdmin");
}
return null;
}

解决方案 »

  1.   

    PersonDaoBean的getTPersonByName方法: 
    public TPerson getTPersonByName(String name){ 
    HibernateTemplate ht = getHibernateTemplate(); 
    List list = ht.find("from TPerson tp where tp.name=?",name); 
    if(list.size() != 0){ 
    TPerson tPerson = (TPerson) list.get(0); 
    return tPerson; 
    }else 
    return null; 
    }=================================
    红色这行不能这样写。
      

  2.   

    find()方法查找的必须是持久化的对象
    改成这样试一下
    List list = getHibernateTemplate().find("from TPerson tp where tp.name=?",name); 
      

  3.   

    哦.我以前是按List list = getHibernateTemplate().find("from TPerson tp where tp.name=?",name);这样写的,我写成上面那样是为了看那个HibernateTemplate是否为空.
    问题还没解决,关键是我在Junit下测试这段代码没有问题,在action下就有问题了.
    谢谢
      

  4.   

    我现在把这个方式改成用session做也还是报同样的空指针异常:
    public TPerson getTPersonByName(String name){
    Session session = HibernateSessionFactory.getSession();
    Query query = session.createQuery("from TPerson tp where tp.name=?");
    query.setParameter(0, name);
    TPerson tPerson = (TPerson) query.setMaxResults(1).uniqueResult(); //这句报错 return tPerson;
    }
      

  5.   

    这个null估计是指你getTPersonByName(Unknown Source) 
    并不是Hibernate这里的问题
      

  6.   

    很奇怪的是.我在别的地方写的getHibernateTemplete.find在action中可以用,就是这个不能用.真是奇怪
      

  7.   

    可能是你的action中注入的dao 时 出了问题。 
    你先注释掉操作hibernate的代码看是否还报 NullPointerException 
      

  8.   

    com.ace.core.dao.impl.PersonDaoBean.getTPersonByName(PersonDaoBean.java:110) 
    com.ace.core.business.impl.PersonManagerBean.login(PersonManagerBean.java:110) 
    你 把这两个文件的的110行代码指出来。
    很可能是spring的配置问题。
      

  9.   

    问题解决了.是hibernate的一个bug,我更新cglib到2.2,然后把hbm.xml中一对多的列设置成为lazy="false".这样就OK 了.谢谢大家